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
这是一个简单的问题。我想知道这样写是不是一样:
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