Django 查询 __isnull=True 或 = None

Django Query __isnull=True or = None

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

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

比:

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

我正在使用 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__isnull=True 表示没有 json:

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