我有以下型号。一个用户可以有多个角色,一个角色可以有多个权限。我不太清楚如何查询以获得我想要的东西。
user_role = db.Table(
'user_role',
db.Column('user_id', db.Integer, db.ForeignKey('user.id')),
db.Column('role_id', db.Integer, db.ForeignKey('role.id')),
db.UniqueConstraint('user_id', 'role_id')
)
role_permission = db.Table(
'role_permission',
db.Column('permission_id', db.Integer, db.ForeignKey('permission.id')),
db.Column('role_id', db.Integer, db.ForeignKey('role.id')),
db.UniqueConstraint('permission_id', 'role_id')
)
class Role(Base):
__tablename__ = 'role'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100), unique=True, nullable=False)
class Permission(Base):
__tablename__ = 'permission'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100), nullable=False)
roles = db.relation(Role, secondary=role_permission, backref=db.backref('permissions'))
class User(Base, UserMixin):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(60), unique=True, nullable=False)
password_hash = db.Column(db.String(80), nullable=False)
roles = db.relation(Role, secondary=user_role, backref=db.backref('users'))
我想获取分配给用户的所有权限的(最好是唯一的)列表,但我似乎不知道该怎么做。
我可以通过在用户模型中创建生成器来获取列表:
def get_all_permissions(self):
for role in self.roles:
for perm in role.permissions:
yield perm
但我希望能够在一个查询中完成此操作。
最佳答案
好吧,要获取权限列表,请尝试如下操作:
permissions = session.query(Permission).\
join(Role).join(User).filter(User.username='MisterX').all()
或者过滤你想要的任何内容。为了使权限唯一,您可以使用分组依据:
permissions = session.query(Permission.id, Permission.name).join(Role).join(User).\
filter(User.username='MisterX').group_by(Permission.id).all()
或者,如果可以的话,在没有特殊查询的情况下,使用声明性扩展:
permissions = User.roles.permissions
这有帮助吗?
关于python - SQLAlchemy 中的多对多查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25392770/