Django Query __isnull = True或= None

时间:2015-04-24 22:40:59

标签: django django-models django-queryset

这是一个简单的问题。我想知道写的是否相同:

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

比:

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

我正在使用django 1.8

3 个答案:

答案 0 :(得分:20)

他们是平等的:

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

答案 1 :(得分:15)

请记住,您无法通过第一个解决方案扭转情况:

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

但是你可以这样做:

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

答案 2 :(得分:0)

这取决于字段的类型。如其他答案中所述,它们通常是等效的,但总的来说,这是不能保证的。

例如,Postgres JSON字段使用#include <iostream> #include <stdio.h> #include <stdlib.h> #define PY_SSIZE_T_CLEAN #ifdef _DEBUG #undef _DEBUG #include <python.h> #define _DEBUG #else #include <python.h> #endif int main() { _putenv_s("PYTHONPATH", "C:\\Anaconda\\envs\\myEnv\\Lib"); // set the python anaconda environment variable Py_Initialize(); // initialize the python interpreter PyRun_SimpleString("import numpy as np"); Py_FinalizeEx(); return 0; } 指定json的值为=None,而null则表示没有json:

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

null json vs no json