首页 > 解决方案 > Queryset 中的过滤器链而不是 Q() 组合

问题描述

我有一个与模型标签有 m2m 关系的文章模型,

我打算过滤带有“python”和“django”标签的文章

我试过 Q 和 &

In [184]: from django.db.models import Q

In [185]: articles = Article.objects.filter(Q(tags__name="python") & Q(tags__name=
   ...: "django"))

In [186]: articles
Out[186]: <QuerySet []>

它返回一个空查询集

或者我测试了

In [202]: articles = Article.objects.filter(Q(tags__name="python")).filter(Q(tags_
   ...: _name="django"))

In [203]: articles
Out[203]: <QuerySet [<Article: Test new tags>, <Article: Django Tutorial>]>

我工作并解决了这个问题。

但是,我对 的失败感到非常困惑,我Q()&Q()是否应该始终使用过滤器链而不是 Q() 组合来避免错误?

标签: django

解决方案


通过这样做.filter(Q(tags__name="python") & Q(tags__name="django"),您要求filter寻找具有同时满足两者的Article相关的 s ,这自然不可能是真的。Tagname="python"name="django"

通过做两个单独.filter()的 s,满足这两个条件的相关标签不必是同一个,因为它们是在两个单独的查询集上完成的,因此他们将能够找到具有Articlewho is和另一个who是。Tagname'python' Tagname'django'


推荐阅读