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)