Django QuerySet.exclude(): 为什么全部被排除在外



我有这样的情况:

ids = [None, None, None]
foo = Foo.objects.filter(common=True).exclude(id__in=ids)

这似乎总是排除所有人。

为什么在这种情况下id__in id受到威胁Nonepk__in也不起作用。我希望它不会排除任何内容,因为所有对象都有有效的 id。

foo = Foo.objects.filter(common=True)

按预期返回所有对象。

您的查询集将生成类似于 select * from foo where NOT (id in (NULL)); 的 SQL

在SQL中,x in (NULL)NOT (x in (NULL))的计算结果都是null,所以查询不返回任何行。有关详细信息,请参阅此问题。

正如@wim注释中指出的那样,解决方案是从列表中过滤掉None值:

foo = Foo.objects.filter(common=True).exclude(id__in=[x for x in ids if x is not None])

最新更新