2016-09-26 1 views
1

Краткая версия: Почему Model.objects.exclude (..__ in = [None]) исключает каждый объект?Понимание поиска поля запроса Django в

Я столкнулся с интересным поведением поиска в поле django, которое я не понимаю. Скажем, у меня есть 21 объектов данной модели:

>>> Model.objects.count() 
21 

Если исключить данный секретный ключ непосредственно или с in поле поиска я получаю ожидаемое поведение:

>>> Model.objects.exclude(pk=1).count() 
20 
>>> Model.objects.exclude(pk__in=[1]).count() 
20 

Если исключить закрытый ключ стоимости None я получить ожидаемый результат:

>>> Model.objects.exclude(pk=None).count() 
21 

Однако, если я не сделать то же самое с поиском in поля я получаю ничего назад:

>>> Model.objects.exclude(pk__in=[None]).count() 
0 

Почему это так?

ответ

2

Я подозреваю, что это связано с тем, как SQL обрабатывает NULL. Запрос компилируется в SELECT COUNT(*) FROM mymodel WHERE NOT (id IN (NULL));.

См., Например, this question для обсуждения того, почему NOT IN с NULL всегда возвращает пустое.

+0

Хорошо. Скорее всего, дело. Не знаю о 'connection.queries' –