理解Django查询集字段查找

时间:2016-09-26 10:38:28

标签: python django-queryset

简短版本:为什么Model.objects.exclude(..__ in = [None])会排除每个对象?

我遇到了一个我不理解的django字段查找的有趣行为。让我们说我有21个给定模型的对象:

>>> Model.objects.count()
21

如果我直接排除某个私钥或使用in字段查找,我会得到预期的行为:

>>> Model.objects.exclude(pk=1).count()
20
>>> Model.objects.exclude(pk__in=[1]).count()
20

如果我排除值None的私钥,我会得到预期的结果:

>>> Model.objects.exclude(pk=None).count()
21

但是,如果我对in字段查找执行相同的操作,我什么也得不回来:

>>> Model.objects.exclude(pk__in=[None]).count()
0

为什么会这样?

1 个答案:

答案 0 :(得分:2)

我怀疑这是因为SQL处理NULL的方式。查询将编译为SELECT COUNT(*) FROM mymodel WHERE NOT (id IN (NULL));

参见例如this question,讨论为什么带有NULL的NOT IN总是返回空。