#角色模型
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操作時,多對多關系的角色權限表(中間關聯表),不需要用戶維護.