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

时间:2017-05-16 00:51:35

标签: 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表绑定到当前用户的角色。

现在,在某些时候,我希望能够查询具有当前用户所具有的任何角色的所有用户。考虑到我们的current_user.roles列表和SQL Alchemy中的模型,如何实现这一目标?如何选择any User.roles current_user.rolesclass UserProfileForm extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('plainPassword', RepeatedType::class, array( 'type' => PasswordType::class, 'first_options' => array( 'label' => 'Password', 'constraints' => array(new NotBlank(array( 'groups' => array( 'updatePasswordChecked', ) ))), ), 'second_options' => array( 'label' => 'Repeat password', 'constraints' => array(new NotBlank(array( 'groups' => array( 'updatePasswordChecked', ) ))), ), 'invalid_message' => 'Passwords don\'t match!', )) ->add('oldPassword', PasswordType::class) ->add('save', SubmitType::class, array('label' => 'Save')); } public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults(array( 'data_class' => 'AppBundle\Entity\User', 'validation_groups' => array('update'), )); } } 匹配的所有用户?

1 个答案:

答案 0 :(得分:5)

__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()