【问题标题】:Flask-SQLAlchemy: How to query according to User's role and team?Flask-SQLAlchemy:如何根据用户的角色和团队进行查询?
【发布时间】:2023-03-10 01:16:01
【问题描述】:

我可以使用Role.id == 4将用户列为审阅者,并且可以由当前用户选择:

def reviewer_choices():
    return User.query.join(User.roles).filter(Role.id == 4)

form_extra_fields = {
     'reviewer1': sqla.fields.QuerySelectField(
      label='Reviewer1',
      query_factory=reviewer1_choices,
)}

现在,如何使用Role.id == 4Team.id == current_user.teams.id 查询用户? (限制审阅者和当前用户属于同一团队

我在下面尝试过,但没有成功:

User.query.join(User.roles).join(User.teams).
     filter(Role.id == 4).filter(Team.id = current_user.teams.id)

类定义如下,谢谢:

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

     def __str__(self):
        return self.name

class Team(db.Model, RoleMixin):
     id = db.Column(db.Integer(), primary_key=True)
     name = db.Column(db.String(80), unique=True)
     description = db.Column(db.String(255))

     def __str__(self):
        return self.name

class User(db.Model, UserMixin):
     id = db.Column(db.Integer, primary_key=True)
     roles = db.relationship('Role', secondary=roles_users,
                         backref=db.backref('users', lazy='dynamic'))
     teams = db.relationship('Team', secondary=teams_users,uselist=False,
                        backref=db.backref('users', lazy='dynamic'))
     email = db.Column(db.String(255), unique=True)

     def __str__(self):
         return self.email

class Project(db.Model):

     id = db.Column(db.Integer, primary_key=True)
     reviewer = db.Column(db.Unicode(128))

     def __unicode__(self):
        return self.name

【问题讨论】:

    标签: python flask flask-sqlalchemy flask-admin


    【解决方案1】:

    更新:

    您应该如下定义您的用户模型:

    # -> 1. many to one
    
    class User(db.Model):
        # ...
        team_id = db.Column(db.Integer, db.ForeignKey("team.id"))
        team = db.relationship("Team", foreign_keys=team_id)
        # ...
    
    User.query.filter(Role.id == 4, Team.id == current_user.team_id).all()
    
    # -> 2. one to one
    
    class User(db.Model):
        # ...
        team_id = db.Column(db.Integer, db.ForeignKey("team.id"))
        team = db.relationship("Team", foreign_keys=team_id, uselist=False)
        # ...
    
    User.query.filter(Role.id == 4, Team.id == current_user.team_id).all()
    
    # -> 3. many to many 
    
    users_teams = db.Table(db.Column("user_id", db.Integer(), db.ForeignKey("user.id"),
                           db.Column("role_id", db.Integer(), db.ForeignKey("team.id"))
    
    class User(db.Model):
        # ...
        teams = db.relationship("Team", secondary=users_teams)
        # ...
    
    User.query.filter(Role.id == 4, User.teams.any(Team.id.in_([team.id for team in current_user.teams]))).all()
    

    uselist 用于定义一对一的关系。

    secondary 用于定义多对多关系。

    【讨论】:

    • 感谢您的回复,但出现错误:TypeError: 'Team' object is not iterable
    • 我使用 Flask-Security 的基本模型定义。 User.query.filter(User.roles.any(Role.id.in_([1,2]))).all() 工作。
    • 我知道。您在 User 中的团队关系定义中使用 uselist=FalseTeamUser 之间有什么关系?多对一还是多对多?
    • TeamUser 之间的关系是一对一的。每个用户只属于一个团队。
    • 我认为可能是多对一。许多用户属于一个团队。
    猜你喜欢
    • 2017-10-06
    • 2014-10-09
    • 2022-01-12
    • 1970-01-01
    • 2014-05-18
    • 2022-01-08
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多