web-dev-qa-db-fra.com

Django Query __isnull = True ou = None

c'est une question simple. Je voudrais savoir si c'est pareil pour écrire:

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

que:

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

J'utilise Django 1.8

29

Ils sont égaux:

>>> 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
23
knbk

Juste pour garder à l'esprit que vous ne pouvez pas inverser la situation avec votre première solution:

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

Cependant, vous pouvez le faire:

queryset = Model.objects.filter(field__isnull=False)
15
Manan Mehta

Cela dépend du type de champ. Comme mentionné dans d'autres réponses, ils sont généralement équivalents mais en général, cela n'est pas garanti.

Par exemple, le champ JSON Postgres utilise =None pour spécifier que le json a la valeur null tandis que __isnull=True signifie qu'il n'y a pas de json:

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

null json vs no json

1
Cameron Lee