了解 Django 中的查询集字段查找
Understanding Django queryset field lookup in
简短版本:为什么 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
为什么会这样?
我怀疑这是因为 SQL 对待 NULL 的方式。查询编译为 SELECT COUNT(*) FROM mymodel WHERE NOT (id IN (NULL));
.
例如,参见 this question 讨论为什么 NOT IN 与 NULL 总是 returns 空。
简短版本:为什么 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
为什么会这样?
我怀疑这是因为 SQL 对待 NULL 的方式。查询编译为 SELECT COUNT(*) FROM mymodel WHERE NOT (id IN (NULL));
.
例如,参见 this question 讨论为什么 NOT IN 与 NULL 总是 returns 空。