SQLAlchemy在循环中生成包含条件的查询
我正在用Flask搭建一个网页应用,里面用到了SQLAlchemy。我有一个叫“get_team()”的函数,让我头疼不已。
def get_team(playerlist) cond = and_(*[Team.users.contains(p) for p in playerlist ]) q = Team.query.filter(cond) ...
我总是收到一个错误信息:“AttributeError: 'unicode' object has no attribute '_sa_instance_state'”。这是我的模型长什么样:
class Team(db.Model): __tablename__ = 'teams' id = db.Column(db.Integer, primary_key=True) users = association_proxy("user_associations", "user", creator=lambda u: Teaming(user=u)) def __repr__(self): s = "" for u in self.users: s = s + u.username + ", " return "Team {tid}: {users_string}".format(tid = self.id, users_string=s) class Teaming(db.Model): __tablename__ = 'teaming' team_id = db.Column(db.Integer, db.ForeignKey('teams.id'), primary_key=True) user_id = db.Column(db.Integer, db.ForeignKey('users.id'), primary_key=True) user = db.relationship("User", backref="team_associations") team = db.relationship("Team", backref="user_associations") def __repr__(self): return "".format(uid = self.user_id, tid = self.team_id) class User(UserMixin, db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) email = db.Column(db.String(64), unique=True, index=True) username = db.Column(db.String(64), unique=True, index=True) password_hash = db.Column(db.String(128)) confirmed = db.Column(db.Boolean, default=False) teams = association_proxy("team_associations", "team", creator = lambda t: Teaming(team=t))
如果能给点建议,我会非常感激!
1 个回答
1
最可能的原因是,playerlist
不是一个包含 User
实例的列表,而是一些字符串(可能是名字)。contains
这个方法只能在模型实例上使用。如果你想处理其他属性,可以使用 any
。
def get_team_of_players(playerlist):
cond = and_(*[Team.users.contains(p) for p in playerlist])
q = Team.query.filter(cond)
return q
p1, p2 = db.session.query(User).get(1), db.session.query(User).get(2)
q = get_team_of_players([p1, p2]).all()
def get_team_of_usernames(usernames):
cond = and_(*[Team.users.any(User.username == p) for p in usernames])
q = Team.query.filter(cond)
return q
p1, p2 = 'user1', 'user2'
q = get_team_of_usernames([p1, p2]).all()