【问题标题】:django AND on Q not working for many to manydjango AND on Q 不适用于多对多
【发布时间】:2014-08-03 07:26:24
【问题描述】:

这是模型:

class ModelA:
    title = charfield
    m2m = foreignkey, relatedname='m2ms'

这是有效的:

ModelA.objects.filter(Q(title__icontains='a') & Q(title__icontains='b'))  

所以它返回所有标题包含字母“a”和“b”的记录。

那么同样不适用于多对多:

ModelA.objects.filter(Q(m2ms__id=1) & Q(m2ms__id=2))    

ModelA m2ms 列表:

for x in ModelA.objects.all():
    print x.m2ms.all().values_list('id', Flat=True)    

#Output:
1,2,3
1,2
1
1,3,5
4,6,7 
1,8

因此,ModelA.objects.filter(Q(m2ms__id=1) & Q(m2ms__id=2)) 的预期输出应该是具有以下 m2m id 的记录:[1,2,3], [1,2]。但它没有发生。为什么?

我不能使用 Q(m2ms__id__in=[1,2]),因为即使我使用 __in=[1,2,3,4,infinite numbers],它也会返回相同的结果

这个问题中提到了使用 Q 而不是过滤器的原因 - django filter on many to many along with Q

【问题讨论】:

  • 为什么不改用filter(Q(field=value), Q(field=value))
  • 这就是问题所在。它不工作。 ',' 等价于 '&'。

标签: django django-q


【解决方案1】:

阅读docs的这一部分。

特别是这一段:

为了处理这两种情况,Django 采用一致的方式来处理 filter() 和 exclude() 调用。单个 filter() 调用中的所有内容同时应用以过滤出符合所有这些要求的项目。连续的 filter() 调用进一步限制了对象集,但对于多值关系,它们适用于链接到主模型的任何对象,不一定是之前的 filter() 调用选择的那些对象。

我相信如果您使用ModelA.objects.filter(Q(m2ms__id__in=[1, 2]))ModelA.objects.filter(m2ms__id__in=[1, 2]),它会按照您的预期工作。

【讨论】:

  • 语法错误 - 关键字参数重复 - ModelA.objects.filter(Q(m2ms__id=1, m2ms__id=2))
  • 更新了使用__in的答案
猜你喜欢
  • 2021-11-25
  • 2021-09-15
  • 2011-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-01
相关资源
最近更新 更多