Django查询uu isnull=True或=None

Django查询uu isnull=True或=None,django,django-models,django-queryset,Django,Django Models,Django Queryset,这是一个简单的问题。我想知道这样写是否相同: queryset = Model.objects.filter(field=None) 比: 我使用的是django 1.8,它们是相等的: >>> str(Person.objects.filter(age__isnull=True).query) == str(Person.objects.filter(age=None).query) True >>> print(Person.objects.filter

这是一个简单的问题。我想知道这样写是否相同:

queryset = Model.objects.filter(field=None)
比:

我使用的是django 1.8,它们是相等的:

>>> str(Person.objects.filter(age__isnull=True).query) == str(Person.objects.filter(age=None).query)
True
>>> print(Person.objects.filter(age=None).query)
SELECT "person_person"."id", "person_person"."name", "person_person"."yes", "person_person"."age" FROM "person_person" WHERE "person_person"."age" IS NULL
>>> print(Person.objects.filter(age__isnull=True).query)
SELECT "person_person"."id", "person_person"."name", "person_person"."yes", "person_person"."age" FROM "person_person" WHERE "person_person"."age" IS NULL

排除:Postgres JSON字段(请参见@cameron lee的答案)

请记住,您无法使用第一个解决方案来逆转这种情况:

# YOU CANNOT DO THIS
queryset = Model.objects.filter(field!=None)
但是,您可以这样做:

queryset = Model.objects.filter(field__isnull=False)

这取决于字段的类型。正如其他答案中提到的,它们通常是等价的,但一般来说,这并不能保证

例如,Postgres JSON字段使用
=None
指定JSON的值为
null
,而
\uu isnull=True
表示没有JSON:


只是想知道使用
field\uu isnull=True'是否比
field=None'快。我想,isnull会更快,因为它似乎与database@unlockme:好吧,它们会产生相同的查询:Django ORM足够聪明,可以使用
is NULL
,因此,在翻译查询中的调用时,除了由于处理此
=None
\uu isnull=True
而产生的一些小差异外,这两个函数同时运行。我在使用和None时遇到了一些问题。例如:uuu in=(None,“,”)将导致False,而Q(uuu isnull=True)将导致True。无法真正弄清楚原因。如果需要反转条件,可以执行
.exclude(field=None)
操作-我个人更喜欢
.exclude
,因为它更明确。但是每次执行此操作时,都会包装查询,如果不必要,还会包装多个查询,可能会造成SQL方面的麻烦,甚至会降低性能@pauloscardineinesting,@wonder为什么会有包装导致的“性能下降”的原因?我从来没有因为多重包装而在PostgreSQL上出现过任何性能问题——根据我的经验,planner在这类查询方面做得非常好。关于查询是笨重的SQL明智的使用ORM的全部要点是不必处理SQL-我不能不关心自动生成的SQL,只要它执行良好…:-)这是一个非常好的答案!我现在很难匹配“无”Postgres JSON字段。筛选器(字段\为\空=真)或筛选器(字段=无)均不工作。我如何匹配这些空postgres JSON字段?@ThrightHouse:听起来可能您存储了字符串“None”,它与SQL null或JSON null都不同。
queryset = Model.objects.filter(field__isnull=False)