Подтвердить что ты не робот

Django: фильтрация запроса по 'field__isnull = True' или 'field = None'?

Мне нужно отфильтровать набор запросов динамическим значением (которое может быть None): могу ли я просто написать:

filtered_queryset = queryset.filter(field=value)

или я должен проверить None:

if value is None:
    filtered_queryset = queryset.filter(field__isnull=True)
else:
    filtered_queryset = queryset.filter(field=value)

Зависит ли поведение от конкретной СУБД?

4b9b3361

Ответ 1

ORM обработает None (приведёт к NULL) для вас и вернет объект QuerySet, поэтому, если вам не нужно перехватывать None первый пример подойдет.

>>> User.objects.filter(username=None)
[]
>>> type(_)
<class 'django.db.models.query.QuerySet'>
>>> str(User.objects.filter(username=None).query)
SELECT "auth_user"."id", "auth_user"."username", "auth_user"."first_name", "auth_user"."last_name", "auth_user"."email", "auth_user"."password", "auth_user"."is_staff", "auth_user"."is_active", "auth_user"."is_superuser", "auth_user"."last_login", "auth_user"."date_joined" FROM "auth_user" WHERE "auth_user"."username" IS NULL

Ответ 2

Я предпочитаю второе решение, которое лучше обрабатывается

Update

if value is None:
  filtered_queryset = queryset.filter(field__isnull=True)
  //Do some proessing with  filtered_queryset object with None values
else:
  filtered_queryset = queryset.filter(field=value)
  //Do some proessing with  filtered_queryset object with not NULL values

Набор запросов может обрабатывать значения Null. Основываясь на этом User.objects.filter(username=None), он будет извлекать только значения, где username = NULL