1.ForeignKey
class Students(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
s_name = db.Column(db.String(20), unique=False, nullable=False)
s_age = db.Column(db.Integer, default=18)
s_g = db.Column(db.Integer, db.ForeignKey('grade.id'), nullable=True)
class Grade(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
g_name = db.Column(db.String(30), unique=True, nullable=False)
students = db.relationship('Students', backref='grade')
__tablename__ = 'grade'
flsk中的一对多
在多的一方需要写一个字段s_g 在其中写上db.ForeignKey(‘grade.id’),参数为一对多的一的一方的主键。这个字段在数据库中是不存在的。
在少的一方需要添加一个relationship字段 students = db.relationship(‘Students’, backref=‘grade’) ,
backref为反向查询的关键字
查询:
正向查询(一查多)
stus = Grade.query.get(id).students
反向查询(多查一)
the_grade = Student.query.get(id).grade
2.ManyToMany
class Students(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
s_name = db.Column(db.String(20), unique=False, nullable=False)
s_age = db.Column(db.Integer, default=18)
s_g = db.Column(db.Integer, db.ForeignKey('grade.id'), nullable=True)
class Course(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
c_name = db.Column(db.String(10), unique=True, nullable=False)
students = db.relationship('Students', secondary='s_c', backref='cou')
__tablename__ = 'course'
中间表:
s_c = db.Table('s_c',
db.Column('s_id', db.Integer, db.ForeignKey('students.id'), primary_key=True),
db.Column('c_id', db.Integer, db.ForeignKey('course.id'), primary_key=True),
)
多对多可以在任意一方中添加一个relationship字段,第一个参数为关联的另外一个表,第二个参数为中间表的表名,第三个参数backref是反向查询时的关键字
在flask中多对多的中间表需要自己建立。建立的中间表的类为db.Table(),第一个参数为中间表的表名,然后在表中添加两个字段,这两个字段分别为关联的两个表的一对多的外键,也同为主键。
查询
正向查询(写有relationship的一边查另外一边)
stus = Course.query.get(id).students
反向查询
course = Students.query.get(id).cou
角色模型
class Role(db.Model):
__tablename__='role'
r_id=db.Column(db.Integer,autoincrement=True,primary_key=True)
r_name=db.Column(db.String(10))
user=db.relationship('User',backref='role')
#角色和权限的(多对多的)关联表
#r_p为关联表的表名
r_p=db.Table('r_p',
db.Column('role_id',db.Integer,db.ForeignKey('role.r_id'),primary_key=True),
db.Column('permission_id',db.Integer,db.ForeignKey('permission.p_id'),primary_key=True))
#权限模型表
class Permission(db.Model):
__tablename__='permission'
p_id=db.Column(db.Integer,autoincrement=True,primary_key=True)
p_name=db.Column(db.String(16),unique=True)
p_er=db.Column(db.String(16),unique=True)
#添加多对多的反向引用,必须使用secondary指定中间关联表
#用权限查询角色时用查询到的权限对象:“权限对象.roles.all()”得到其对应的所有角色
roles=db.relationship('Role',secondary=r_p,backref=db.backref('permission',lazy=True))
#db.backref('permission', 中的permission用来反向关联,用角色查询其对应的所有权限。用查询到的 '角色对象.permission.all()'得到。
###relationship可以放到任意一个类中都行,与之相反。###
#多对多关系查询
#根据角色找权限
####多对多关系中获取对象,只能用get(id)方法,不能通过filter或者filter_by来获取###
role=Role.query.get(id)
per=role.permission.all()
return ','.join(c.name for c in per)
#根据权限来找角色
per=Permission.query.get(id)
role=per.roles.all()
return ','.join(i.name for i in role)
#多对多关系添加
role=Role.query.get(id)
per=Permission.query.get(id)
#给角色添加权限
role.permission.append(per)
#多对多关系删除
role=Role.query.get(id)
per=Permission.query.get(id)
#给角色删除权限
role.permission.remove(per)
总结:ORM操作时,多对多关系的角色权限表(中间关联表),不需要用户维护.