在SQLalchemy和Flask中从相关列表中查询
我有一个 User
,它和一个 Person
有一对一的关系。所以 User.person
就是一个 Person
。
我想从一堆 Person
中获取 User
的列表。
我试过以下方法:
>>> people = Person.query.filter().limit(3)
<flask_sqlalchemy.BaseQuery object at 0x111c69bd0>
>>> User.query.filter(User.person.in_(people)).all()
NotImplementedError: in_() not yet supported for relationships. For a simple many-to-one, use in_() against the set of foreign key values.
有没有什么好的方法可以从这堆 people
中找出 User
的列表,条件是 User.person
在这堆 people
里?
2 个回答
1
你还可以把生成器和 or_
一起使用:
from sqlalchemy.sql import or_
people = Person.query.filter().limit(3)
cond = or_(*[User.person == person for person in people])
User.query.filter(cond).all()
这在你想要请求一些已经收到的对象的记录时会很有用,比如状态信息。
22
正如错误信息所提示的,你需要对外键使用 in_
。
User.query.join(User.person).filter(Person.id.in_(p.id for p in people)).all()
因为你反正要查询这两个,所以最好先把它们连接起来加载,然后再用Python获取这些人。
people = Person.query.join(Person.user).options(db.contains_eager(Person.user)).limit(3).all()
users = [p.user for p in people]