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

时间:2017-11-01 15:39:21

标签: python django

我有这样的情况:

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

这似乎总是排除所有。

在这种情况下,为什么id的{​​{1}}威胁为id__inNone也没有工作。我希望它不会排除任何内容,因为所有对象都有有效的ID。

pk__in

返回所有预期的对象。

1 个答案:

答案 0 :(得分:3)

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

的SQL

在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])