在使用重复参数而不是链接过滤器时,如何使用Q对象进行AND查找?

时间:2015-10-21 03:10:43

标签: python django django-q

我意识到我的问题更简单,我将离开前一个问题的主体作为进一步的解释。我在使用Q对象进行AND查询时遇到问题。它是如何工作的?我已经提供了4个示例,并且我唯一可以让它工作的是链接过滤器,但是我想避免使用OR来构建更复杂的查询。

在与同一个查询参数进行AND运算时,我遇到了与Q对象的关系进行查询的问题。

在Django文档页面上修改一些示例:'Blog'模型与'Author'模型有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')

返回正确的结果,但是,现在我失去了为OR参数使用Q对象的能力(我相信),所以我必须做另一个查询并将结果放在2个查询集中,这是不希望的

我不确定我是否正确地解释了我的情况,或者我是否正确地解决了这个问题。有人有什么建议吗?

2 个答案:

答案 0 :(得分:0)

我相信这应该有效:

{{1}}

答案 1 :(得分:0)

所以,似乎你不能使用Q对象和相同的参数,即使它是在M2M关系中。我发现solution on Reddit基本上构造了带链接过滤器的多个查询,然后将它们组合在一起,从而消除了对Q对象的需求:

b1 = Blog.objects.filter(authors__name='bob').filter(authors__name='mary')
b2 = Blog.objects.filter(authors__name='steve')
qs = b1 | b2