flask-模型(models)

文章目录

      • 1. 一对多 关系模型
        • 1.1 关联方式
      • 2. 一对一 关系模型
      • 3. 多对多 关系

1. 一对多 关系模型

1.1 关联方式

	1. 在 一 方 模型中 通过 relationship 函数从对象角度关联 多 方
		db.relationship('多方模型类名称',backref='反向应用名称')
	2. 在 多方 模型中 通过在 Column() 中设置 ForeignKey() 从数据库表角度设置外键,关联 一 方
		db.Column(db.Interger,db.ForeignKey("一方表名称.一方表主键"),nullable=False)
		返回的类属性名为 表中的外键名
from SQLAlchemyAPP.ext import db
# db是SQLAlchemy的实例化对象

class School(db.Model):   # "一方"
    __tablename__ = "schools"
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    name = db.Column(db.String(20),nullable=False)
    address = db.Column(db.String(50))
    students = db.relationship("Student",backref="univercity") # 关联学生模型,并设置反向引用名称

class Student(db.Model):   # "多方"
    __tablename__ = "students"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(20), nullable=False)
    age = db.Column(db.Integer)
    sex = db.Column(db.String(10))
    score = db.Column(db.Float)
    # 在多方从数据库层面关联一方
    school_id = db.Column(db.Integer,db.ForeignKey("schools.id"),nullable=False)
操作举例:
1. 添加 多 方记录
	1.1 通过外键关联 “一”方:
	eg: student1 = Student(name="张三",age=20,sex="男",school_id=1)
	1.2 通过反向引用名称关联“一”方:
	eg:  student2 = Student(name="李四",age=25,sex="男",university=school1)
	注:university是反向引用名称

2. 从“一”方查询“多”方
   2.1 通过“一”方模型中relationship()函数对应的类属性直接查询。
   			eg: 已知学校查询学生 school1.students
   
 3. 从“多”方查询“一”方
 	3.1 通过反向引用名称直接查询对应的“一”方实例对象
            eg: 已知学生查询学校  student3.university

2. 一对一 关系模型

	1. 在某一方:db.relationship('另一方模型类名称',backref='反向引用名
	    称',uselist=False)
	 2. 在维护关系的“一”方:db.Column(db.Integer,db.ForeignKey("另一方表名称.主
	     键"),nullable=False,unique=True)
# 被依赖的 一方
class Person(db.Model):
	__tablename__ = "person"
	id = db.Column(db.Integer,primary_key=True,autoincrement=True)
	name = db.Column(db.String(20),nullable=False)
	# uselist = False ,指定该类属性(card 类属性) 禁用列表结果
	card = db.relationship("Card",backref="per",uselist=False)
# 依赖的 一方
class Card(db.Model):
	__tablename__ = "cards"
	id = db.Column(db.Integer,primary_key=True,autoincrement=True)
	cardno = db.Column(db.String(20),unique=True)
	# 设置唯一外键
	person_id = db.Column(db.Integer,db.ForeignKey("person.id"),unique=True) 

3. 多对多 关系

1. 创建 db = SQLAlchemy()
2. db.Table() 创建中间关系表
3. 创建两个 多 方模型
# 实例化 db
db = SQLAlchemy()
# 中间关系表对应的代码
user_group = db.Table( "user_group_relation",
	db.Column("userid",db.Integer,db.ForeignKey("users.id"),primary_key=True),
	db.Column("groupid",db.Integer,db.ForeignKey("groups.id"),primary_key=True),
)

# 要户模型
class User(db.Model):
       __tablename__ = 'users'
       id = db.Column(db.Integer,primary_key=True)
       name = db.Column(db.String(20))
       ugroups = db.relationship("Group",secondary=user_group,backref=db.backref("gusers"))

# 组模型
class Group(db.Model):
       __tablename__ = 'groups'
       id = db.Column(db.Integer, primary_key=True)
       name = db.Column(db.String(20))
       
# 具体操作 添加两个用户
user1 = User(name="令狐冲")
user2 = User(name="郭靖")
user3 = User('黄蓉')
db.session.add(user1)
db.session.add(user2) 
db.session.add(user3)
db.session.commit()

# 添加三个组
group1 = Group(name="乒乓球组")
group2 = Group(name="喝酒组")
group3 = Group(name="读书组")
db.session.add(group1)
db.session.add(group2)
db.session.add(group3)
db.session.commit()

# 添加关联关系
user1.ugroups.append(group1)
user1.ugroups.append(group2)
db.session.commit()

user2.ugroups.append(group1)
user2.ugroups.append(group3)
db.session.commit()

# 也可以通过组,主动关联人
group3.gusers.append(user3)

# 用户关联多个组,也可以使用extend
user2.ugroups.extend([group1,group3])

# 查询user1加入的组名称:
 for g in user1.ugroups:
        print(g.name)
# 查询加入group1的用户姓名:
for u in group1.gusers:
        print(u.name) 

你可能感兴趣的:(flask框架,flask,数据库,python)