【问题标题】:SQLAlchemy generating query in loop with containsSQLAlchemy 在包含的循环中生成查询
【发布时间】:2014-10-31 23:50:53
【问题描述】:

我正在 Flask 中构建一个涉及一些 SQLAlchemy 的 Web 应用程序。我有一个函数“get_team()”让我发疯。

def get_team(玩家列表) cond = and_(*[Team.users.contains(p) for p in playerlist ]) q = Team.query.filter(cond) ...

我不断收到错误消息:“AttributeError: 'unicode' object has no attribute '_sa_instance_state'”。模型如下所示:

班级团队(db.Model): __tablename__ = '团队' id = db.Column(db.Integer, primary_key=True) users = association_proxy("user_associations", "user", creator=lambda u: Teaming(user=u)) def __repr__(self): s = "" 为你在 self.users 中: s = s + u.username + ", " return "团队 {tid}: {users_string}".format(tid = self.id, users_string=s) 班组(db.Model): __tablename__ = '合作' 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("用户", backref="team_associations") team = db.relationship("团队", backref="user_associations") def __repr__(self): return "".format(uid = self.user_id, tid = self.team_id) 类用户(UserMixin,db.Model): __tablename__ = '用户' id = db.Column(db.Integer, primary_key=True) 电子邮件 = db.Column(db.String(64),唯一 = True,索引 = True) 用户名 = db.Column(db.String(64),唯一 = True,索引 = True) password_hash = db.Column(db.String(128)) 确认 = db.Column(db.Boolean, default=False) 团队 = 关联代理(“团队关联”,“团队”,创建者 = lambda t:团队(团队 = t))

任何方向将不胜感激!

【问题讨论】:

    标签: python sql flask sqlalchemy


    【解决方案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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-03
      • 1970-01-01
      • 1970-01-01
      • 2020-11-06
      • 2011-06-23
      • 1970-01-01
      相关资源
      最近更新 更多