我有两个表User
和Object
,它们具有一对多的关系(User
可以有多个objects
。)
如何以符合pep8的方式过滤具有至少一个对象的用户?
此代码有效,但不符合pep8:
query = session.query(User.id)
query = query.filter(User.objects != None)
文档使用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))
答案 0 :(得分:6)
正如您所指出的,isnot
并未针对关系实现,而是仅针对简单列。
至于关系,有一个更强大的一般构造any(criterion, ...)
。
在您的情况下,您可以在下面编写符合PEP8标准的代码,它会产生与您的问题完全相同的SQL
:
q = session.query(User.id)
q = q.filter(User.objects.any())
但它也允许您执行更复杂的查询,例如:返回用户,不包含value > 100
的对象:
q = session.query(User.id)
q = q.filter(~User.objects.any(Object.value > 100))
答案 1 :(得分:-3)
您可能知道,在Django中,可以在simple, declarative way中完成此类过滤:
Entry.objects.filter(blog__name='Beatles Blog')
我一直梦想在SQLAlchemy中有这样的东西。
好消息:几周前,我为此创建了:https://github.com/absent1706/sqlalchemy-mixins#django-like-queries
此外,软件包还包含非常有用的电池: SQLAlchemy的Active Record 以及嵌套的预先加载且可读__repr__
。