如何根据flask sqlalchemy中的一些约束来查询多对多?

时间:2015-09-14 23:37:05

标签: python flask sqlalchemy flask-sqlalchemy

如果我有UserItem模型,并且它们之间存在多对多关联,那么如何构建返回的查询:

(1)属于名为“Bob”

的任何用户的所有项目

我试过了:

Item.query.filter(User.name == 'Bob')

返回所有项目而不管用户名称(不正确)

(2)所有名称为“shark”且属于名为“Bob”的用户

的项目

我试过了:

Item.query.filter(User.name == 'Bob' & Item.name == 'shark')

与上面相同,但只返回名为“shark”的项目,无论用户名称如何。 (不正确的)

我的模型定义:

association_table = Table('items_users',
    Column('itemid', Integer, ForeignKey('item.id'), primary_key=True),
    Column('userid', Integer, ForeignKey('user.id'), primary_key=True)
)

class Item(Model):
    # other fields...

    # many to many association
    users = relationship('User', secondary=association_table, lazy='dynamic', backref=backref('items', lazy='dynamic'))

class User(Model):
    # other fields...

两个查询的适当语法是什么?

1 个答案:

答案 0 :(得分:2)

您需要加入要查询的表,以便过滤一个将过滤与另一个相关联的组合行。由于您已经定义了两个模型之间的关系,因此可以加入它而不是手动指定连接条件。

Item.query.join(Item.users).filter(User.name == 'bob')
Item.query.join(Item.users).filter(User.name == 'bob', Item.name == 'shark')

the comprehensive tutorial in the SQLAlchemy docs中介绍了处理关系和联接。