1. 一对多 关系模型
1.1 关联方式
1. 在 一 方 模型中 通过 relationship 函数从对象角度关联 多 方
db.relationship('多方模型类名称',backref='反向应用名称')
2. 在 多方 模型中 通过在 Column() 中设置 ForeignKey() 从数据库表角度设置外键,关联 一 方
db.Column(db.Interger,db.ForeignKey("一方表名称.一方表主键"),nullable=False)
返回的类属性名为 表中的外键名
from SQLAlchemyAPP.ext import db
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
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
操作举例:
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
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)
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 = 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)
user2.ugroups.extend([group1,group3])
for g in user1.ugroups:
print(g.name)
for u in group1.gusers:
print(u.name)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60