【发布时间】: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))? -
这就是问题所在。它不工作。 ',' 等价于 '&'。