Что является эквивалентом Django ORM для sql "field <> 1"?
Если предположить, что "поле" является nullable, то в сыром sql условие WHERE field <> 1
будет исключать все строки, отличные от 1, а также исключать все NULL строки.
Почему Django ~Q(field=1)
делает запрос WHERE (NOT (field = 1 AND field IS NOT NULL))
, который приводит к include NULL строк. Есть ли эквивалент sql field <> 1
в Django ORM?
Потому что интерпретация Django имеет больше смысла с точки зрения разработчика Python. В SQL есть отдельные конструкции для проверки нулевых значений (IS NULL
и IS NOT NULL
), и оба field == NULL
и field <> NULL
являются NULL
(ни true
, ни false
), что не совсем интуитивно понятно.
Подумайте об этом следующим образом: Если я хочу получить все строки, в которых field <> 1
, я, вероятно, хочу получить и строки со значениями NULL
, потому что NULL
- это не 1
.
Если вы хотите воспроизвести такое же поведение, вы можете использовать что-то вроде
MyModel.objects.exclude(field=1).exclude(field__isnull=True)