python - Flask-SQLAlchemy 按关系属性查询记录

标签 python flask sqlalchemy flask-sqlalchemy

在我一直致力于开发的应用程序中,使用 Flask-User 及其建议的授权控制模型。这是一个例子:

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)

    # User Authentication information
    username = db.Column(db.String(50), nullable=False, unique=True)
    password = db.Column(db.String(255), nullable=False, default='')

    # User Email information
    email = db.Column(db.String(255), nullable=False, unique=True)
    confirmed_at = db.Column(db.DateTime())

    # User information
    is_enabled = db.Column(db.Boolean(), nullable=False, default=False)


    # Relationships
    roles = db.relationship('Role', secondary='user_roles',
                            backref=db.backref('users', lazy='dynamic'))

class Role(db.Model):
    id = db.Column(db.Integer(), primary_key=True)
    name = db.Column(db.String(50), unique=True)

class UserRoles(db.Model):
    id = db.Column(db.Integer(), primary_key=True)
    user_id = db.Column(db.Integer(), db.ForeignKey('user.id', ondelete='CASCADE'))
    role_id = db.Column(db.Integer(), db.ForeignKey('role.id', ondelete='CASCADE'))

此外,作为 Flask-User/Flask-Login 的一部分,current_user 给我一个 User 对象,对应于应用程序的当前用户(如果已登录) ) 并且,正如在我们的模型中定义的那样,current_user.roles 返回一个 Role 对象列表,对应于 UserRoles 绑定(bind)到当前用户的角色 表。

现在,在某个时候,我希望能够查询具有当前用户所具有的任何角色的所有用户。鉴于我们的 current_user.roles 列表和我在 SQL Alchemy 中的模型,如何实现这一点?如何选择所有 anyUser.roles 匹配我们的 current_user.roles 的所有用户?

最佳答案

添加__repr__到角色如下:

class Role(db.Model):

    #...

    def __repr__(self):

        return self.id

您可以使用以下查询来实现您的要求。

User.query.filter(User.roles.any(Role.id.in_([role.id for role in current_user.roles]))).all()

关于python - Flask-SQLAlchemy 按关系属性查询记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43990869/

相关文章:

python - Python 中的多处理 : how to implement a loop over "apply_async" as "map_async" using a callback function

python - 如何在openerp序列中的_interpolation_dict中创建新属性?

python - 在 Windows 中为 Flask 应用程序导出环境变量

python - 将 GeoIP 模块与 Nginx 和 UWSGI 结合使用

sqlite - 如何仅将尚未存在于数据库中的记录保存到数据库中?

mysql - 仅连接匹配特定条件的行 SQLAlchemy

python - KivyMD 如何更改 MDToolbar 标题大小和字体?

python - 如何访问数据框滚动窗口中的单个元素

python - Flask 教程故障排除 : ModuleNotFoundError: No module named 'app'

使用自动加载的 Python 和 SQLAlchemy 经典映射 : Mapper could not assemble any primary key columns for mapped table