我有这样的情况:
ids = [None, None, None]
foo = Foo.objects.filter(common=True).exclude(id__in=ids)
这似乎总是排除所有人。
为什么在这种情况下id__in
id
受到威胁None
? pk__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])