Django: фильтрация по значению в [None, other] - PullRequest
2 голосов
/ 25 марта 2019

У меня та же проблема, что и у OP в этой теме: Django - фильтрация по «определенному значению или None» :

У меня есть поле в объекте данных, которое можетбыть либо нулевым, либо установленным в какое-то целое число.Я хочу, учитывая целое число, отфильтровать все объекты с этим целочисленным значением ИЛИ ни одним:

MyElements.objects.all().filter(value__in=[myInt, None]) # Query 1

Однако эта строка не работает для элементов с нулевым значением.Точнее:

MyElements.objects.all().filter(value__in=[None]) # Query 2

ничего не возвращает.тогда как

MyElements.objects.all().filter(value = None) # Query 3

возвращает нулевые элементы.

Как правильно переписать исходный запрос (который включает myInt)?

Я знаю, чтоОП принял ответ, но я хотел бы знать, , почему Query 2 не дал никаких результатов.

Ответы [ 2 ]

2 голосов
/ 25 марта 2019

Он основан на правилах SQL для выполнения. Значения NULL не являются фактическими значениями для сравнения. это неизвестная ценность.

Подробнее об этом читайте здесь: is null vs == null

В Django вы можете получить записи со значениями NULL, такими как:

MyElements.objects.filter(value__isnull = True)

Так что вам нужно сначала отфильтровать None свой список сравнений и добавить его в свой запрос самостоятельно.

from django.db.models import Q
MyElements.objects.filter(Q(value__in = [list_of_vals]) | Q(value__isnull = True))
1 голос
/ 25 марта 2019

Вы должны проверить, является ли поле пустым, используя вместо этого фильтр isnull; в противном случае в SQL любое значение по сравнению со значением NULL всегда будет оцениваться как false:

from django.db.models import Q
MyElements.objects.filter(Q(value=myInt) | Q(value__isnull=True))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...