Django 查询 __isnull=True 或 = 无

Posted

技术标签:

【中文标题】Django 查询 __isnull=True 或 = 无【英文标题】:Django Query __isnull=True or = None 【发布时间】:2015-07-03 17:16:23 【问题描述】:

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

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

比:

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

我正在使用 django 1.8

【问题讨论】:

【参考方案1】:

他们是平等的:

>>> 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 的回答)

【讨论】:

只是想知道是否使用field__isnull=True' is not faster than field=None` 我想,isnull 会更快,因为它似乎与数据库匹配 @unlockme:好吧,它们会导致 same 查询:Django ORM 足够聪明,可以使用IS NULL,因此除了由于处理此@而导致的一些小差异987654325@,与__isnull=True翻译查询中的调用时,两者同时运行。 我在使用 __in 和 None 时遇到了一些问题。例如: __in=(None, "", " ") 将导致 False,而 Q(__isnull=True)|Q(__in=("", " ")) 将导致 True。永远无法真正弄清楚原因。 @Dougyfresh 看起来像一个 Django 错误 - 这里也引用了:***.com/questions/20225340/… @Anupam,这不是错误。 Null 不会与包括 null 在内的任何值进行比较。例如,“选择 null = null;”将返回 null,而不是 true。 “在 [1, 2, null] 中选择 null”将返回 false。测试某事物是否为 null 的唯一方法是使用“is null”。【参考方案2】:

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

例如,Postgres JSON 字段使用=None 指定json 的值为null__isnull=True 表示没有json:

https://docs.djangoproject.com/en/3.0/ref/contrib/postgres/fields/#jsonfield

【讨论】:

非常好的答案!喜欢它 我目前很难匹配“无”Postgres JSON 字段。 filter(field__is_null=True) 或 filter(field=None) 都不起作用。我将如何匹配这些 null postgres JSON 字段? @thrillhouse:听起来你可能已经存储了字符串“None”,它不同于 SQL null 或 json null。【参考方案3】:

请记住,您无法使用第一个解决方案来逆转条件:

# YOU CANNOT DO THIS
queryset = Model.objects.filter(field!=None)

但是你可以这样做:

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

【讨论】:

如果您需要反转条件,您可以使用.exclude(field=None) - 我个人更喜欢.exclude,因为它更明确。 但是,每次执行此操作时,您都会包装查询,并且如果不必要的话,多个查询包装可能会很麻烦,甚至会降低性能@PauloScardine 有趣,@wonderwhy 为什么你有由于包装导致的“性能下降”的来源?由于多重包装,我在使用 PostgreSQL 时从来没有出现过任何性能故障——根据我的经验,规划器在这种查询方面做得非常好。关于查询是繁琐的 SQL 方式,使用 ORM 的全部意义在于不必处理 SQL - 只要它执行良好,我就不会关心自动生成的 SQL... :-) 相当评论

以上是关于Django 查询 __isnull=True 或 = 无的主要内容,如果未能解决你的问题,请参考以下文章

AttributeError:类型对象'Categories'在Django中没有属性'user_id__isnull'

Django JSONField isnull 查找

空查询返回数据库中的所有字段。Django

Django - 查询集和一般 SQL 问题

Django学习ORM

Django查询过滤器空