我意识到我的问题更简单,我将离开前一个问题的主体作为进一步的解释。我在使用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个查询集中,这是不希望的
我不确定我是否正确地解释了我的情况,或者我是否正确地解决了这个问题。有人有什么建议吗?
答案 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