python - SQLAlchemy 中的多对多查询

标签 python sqlalchemy

我有以下型号。一个用户可以有多个角色,一个角色可以有多个权限。我不太清楚如何查询以获得我想要的东西。

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/

相关文章:

postgresql - Postgres重采样时间序列数据

python - django 中的表单验证

python - SqlAlchemy sql.text 提升限制子句

python - 如何在 Tornado RequestHandler 中存储数据库 session

python - 异步 def on_ready() : Discord bot Python troubleshooting needed

python - Jupyter 中的 MySQL 查询或标识符太长?

python - SQLAlchemy 内存占用 select 语句

python - 将 pandas DataFrame 写入内存缓冲区中的 HDF

python - Scrapy setup ubuntu 16.04 或任何其他

python - 与 IBM Watson Server 的连接中断