SQLAlchemy:按关系过滤

bar*_*ard 5 python sqlalchemy

我有2个表,User并且Object具有一对多的关系(User可以有很多objects).

如何以符合pep8的方式过滤具有至少一个对象的用户?

此代码有效,但不符合pep8:

query = session.query(User.id)
query = query.filter(User.objects != None)
Run Code Online (Sandbox Code Playgroud)

文档提到使用isnot:http://docs.sqlalchemy.org/en/rel_1_0/orm/tutorial.html#common-filter-operators

但是以下代码会导致未实现的错误.

query = session.query(User.id)
query = query.filter(User.objects.isnot(None))
Run Code Online (Sandbox Code Playgroud)

van*_*van 8

正如您所指出的,isnot不是为关系实现的,而是仅针对简单列.

至于关系,有一个更普遍的更强大的构造any(criterion, ...).

在您的情况下,您可以编写下面符合PEP8的代码,它将与SQL您的问题完全相同:

q = session.query(User.id)
q = q.filter(User.objects.any())
Run Code Online (Sandbox Code Playgroud)

但它也允许您执行更复杂的查询,例如:return Users,其中没有以下对象value > 100:

q = session.query(User.id)
q = q.filter(~User.objects.any(Object.value > 100))
Run Code Online (Sandbox Code Playgroud)