django - 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() 组合来避免错误?
解决方案
通过这样做.filter(Q(tags__name="python") & Q(tags__name="django")
,您要求filter
寻找具有同时满足两者的Article
相关的 s ,这自然不可能是真的。Tag
name="python"
name="django"
通过做两个单独.filter()
的 s,满足这两个条件的相关标签不必是同一个,因为它们是在两个单独的查询集上完成的,因此他们将能够找到具有Article
who is和另一个who是。Tag
name
'python'
Tag
name
'django'
推荐阅读
- javascript - 使用动态上下文数据时如何用新的 React 上下文 api 替换旧的 React contextTypes?
- javascript - 数组中的空元素是什么意思,如果理论上它不存在,为什么要在长度中考虑它
- python-3.x - tf.estimator.export.build_raw_serving_input_receiver_fn 问题
- python - Python枚举迭代子集
- php - 如何为 Wp 所有导入编码以更新 ACF 字段
- java - JUnit - 比较未知的 Collection 和 ArrayList
- angular-material - 如何在角度材料表的垫表列中添加子列
- three.js - 为什么 Camera 和 Object3D 看起来方向相反?
- python - 如何以最佳(pythonic)方式编写此代码?
- javascript - 将数组的项合并到一个对象中