首页 > 解决方案 > 多对多字段的Django过滤器不起作用

问题描述

有一个文章模型,它有多对多的类别字段。我想按该字段过滤它,但它不像我预期的那样工作。例如:

MyModel.objects.filter(categories__id__in = [0, 1, 2])

即使它没有 id 为 2 的类别,它也会获得类别为 0 和 1 的模型。我尝试过这样的事情:

MyModel.objects.filter(Q(categories__id = 0) & Q(categories__id = 1) & Q(categories__id = 2))

但它甚至不起作用。如果它具有所有这些类别,它甚至不会获得模型。

顺便说一句,我不想​​使用超过 1 种过滤方法

那么,有什么适合我的解决方案吗?

谢谢。

PS:django AND on Q 对多对多不起作用——同样的问题,但作者仍然没有得到答案。

标签: djangodjango-modelsdjango-orm

解决方案


您可以计算它是否匹配三个Categorys,因此只检索三个匹配的项目:

from django.db.models import Count

MyModel.objects.filter(
    categories__id__in=[0, 1, 2]
).annotate(
    category_count=Count('categories')
).filter(category_count=3)

推荐阅读