在SQLalchemy和Flask中从相关列表中查询

9 投票
2 回答
5462 浏览
提问于 2025-04-18 05:10

我有一个 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]

撰写回答