3

这是模型:

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 with Q

4

1 回答 1

1

阅读文档的这一部分。

特别是这一段:

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

我相信如果你这样做,ModelA.objects.filter(Q(m2ms__id__in=[1, 2]))或者ModelA.objects.filter(m2ms__id__in=[1, 2])它会按你期望的那样工作。

于 2014-06-13T00:37:12.337 回答