我有这样的情况:
ids = [None, None, None]
foo = Foo.objects.filter(common=True).exclude(id__in=ids)
这似乎总是排除所有。
在这种情况下,为什么id
的{{1}}威胁为id__in
? None
也没有工作。我希望它不会排除任何内容,因为所有对象都有有效的ID。
pk__in
返回所有预期的对象。
答案 0 :(得分:3)
您的查询集将生成类似于select * from foo where NOT (id in (NULL));
在SQL中,x in (NULL)
和NOT (x in (NULL))
都评估为null
,因此查询不返回任何行。有关详细信息,请参阅this question。
@wim在评论中指出的解决方案是从列表中筛选出None
值:
foo = Foo.objects.filter(common=True).exclude(id__in=[x for x in ids if x is not None])