Flask-SQLAlchemy: How to query according to User's role and team?
Clash Royale CLAN TAG#URR8PPP
Flask-SQLAlchemy: How to query according to User's role and team?
I am able to list the users as reviewer with Role.id == 4
, and can be selected by the current user:
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,
)
Now, how can I query the users are with Role.id == 4
and Team.id ==
? (Restrict reviewer and current user are with same team)
current_user.teams.id
Role.id == 4
Team.id ==
current_user.teams.id
I've tried below but in vain:
User.query.join(User.roles).join(User.teams).
filter(Role.id == 4).filter(Team.id = current_user.teams.id)
The classes are defined as below, thanks:
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
1 Answer
1
UPDATE:
You should define your User model as follows:
# -> 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
is used to define a one to one relationship.
uselist
secondary
is used to define many to many relationship.
secondary
TypeError: 'Team' object is not iterable
I use the basic model define of Flask-Security.
User.query.filter(User.roles.any(Role.id.in_([1,2]))).all()
works.– stamaimer
May 11 '17 at 4:31
User.query.filter(User.roles.any(Role.id.in_([1,2]))).all()
I know. You use
uselist=False
in the define of relationship of teams in User . What's the relation between Team
and User
? many to one or many to many?– stamaimer
May 11 '17 at 4:33
uselist=False
Team
User
The relation between
Team
and User
is one to one. Each user only belongs to one team.– Samoth
May 11 '17 at 5:07
Team
User
I think it might be many to one. many users belong to one team.
– stamaimer
May 11 '17 at 5:14
By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.
Thanks for your reply but the error occured:
TypeError: 'Team' object is not iterable
– Samoth
May 11 '17 at 3:23