【发布时间】:2016-01-19 22:01:12
【问题描述】:
我意识到我的问题更简单,我将保留上一个问题的正文作为进一步的解释。我在使用 Q 对象进行 AND 查询时遇到问题。它是如何工作的?我提供了 4 个示例,我唯一可以让它工作的时间是在链接过滤器时,但是我想避免这种情况,以使用 OR 构建更复杂的查询。
在对同一个查询参数进行“与”运算时,我在跨与 Q 对象的关系进行查询时遇到问题。
稍微修改 Django 文档页面上的示例:“博客”模型与“作者”模型具有 m2m 关系。假设我要查询满足以下条件的所有博客:Bob 和 Mary 是作者或 Steve 是作者。我很确定这样做的唯一方法是使用 Q 对象,所以我将它分解成块。这是我迄今为止尝试过的:
Blog.objects.filter(Q(author__name='bob', author__name='mary'))
返回 SyntaxError:关键字参数重复
Blog.objects.filter(Q(author__name='bob') & Q(author__name='mary'))
返回一个空的查询集
Blog.objects.filter(author__name='bob', author__name='mary')
返回 SyntaxError:关键字参数重复
Blog.objects.filter(author__name='bob').filter(author__name='mary')
返回正确的结果,但是,现在我失去了使用 Q 对象作为 OR 参数的能力(我相信),所以我必须进行另一个查询并将结果放在 2 个查询集中,这是不希望的
我不确定我是否正确解释了我的情况,或者我是否以正确的方式进行处理。有人有什么建议吗?
【问题讨论】:
-
试试这个 Blog.objects.filter((Q(author__name='bob') & Q(author__name='mary')) | Q(author__name='steve'))
-
@solarissmoke 不幸的是,这个答案基本上是我的第四个例子。我正在链接过滤器,除非我运行另一个查询,否则我无法执行 OR。
-
@ManjunathSatyamurthy 它总是返回 OR 参数,因为左边是我的第二个例子,它总是返回空。
-
@spanishgeek 不确定当您说您必须进行另一个查询/将结果放在两个查询集中时是什么意思?您的第四个(链式)查询将返回 one 查询集,该查询集匹配所有以 Bob 和 Mary 作为作者的书籍。