Что является эквивалентом 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)
Вернуться на верх