2017-05-16 6 views
0

私が取り組んでいるアプリケーションでは、Flask-Userとその推奨モデルを使用して認証を制御しています。 、またFlask-SQLAlchemy関係属性別のレコードを照会

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')) 

フラスコユーザー/フラスコログインの一部として、current_userは私に定義されるように、(ログインしている場合)と、アプリケーションの現在のユーザに対応Userオブジェクトを与える:ここで例です私たちのモデルcurrent_user.rolesは、UserRolesテーブルによって現在のユーザにバインドされているロールに対応するRoleオブジェクトのリストを返します。

現在、ある時点で、現在のユーザーが持つ役割を持つすべてのユーザーにクエリを実行できるようにしたいと考えています。私たちのcurrent_user.rolesリストとSQL Alchemyの私のモデルをどうすれば達成できますか? User.rolesanycurrent_user.rolesのいずれかと一致するすべてのユーザーを選択するにはどうすればよいですか?

class Role(db.Model): 

    #... 

    def __repr__(self): 

     return self.id 

をそして、あなたはあなたの条件を達成するために、次のクエリを使用することができます。

答えて

1

次のようにロールへ__repr__を追加します。

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

ありがとうございます!私はそれを試して、クエリ 'ArgumentError:Object 1はSQLのリテラル値として合法ではありません.'の' in'演算で次のエラーを受け取りました。 –

+0

@GabrielSiqueira最新の回答をお試しください。 – stamaimer

+0

これは完全に機能します。ありがとう! –

関連する問題