2013-05-03 2 views
22

я должен фильтровать QuerySet динамического значения (которое не может быть None): могу я просто написать:Django: filtering queryset by 'field__isnull = True' или 'field = 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) 

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

ответ

27

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

>>> User.objects.filter(username=None) 
[] 
>>> type(_) 
<class 'django.db.models.query.QuerySet'> 
>>> print 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 
+1

+1 Я не знал, что он обрабатывал« Нет », что очень полезно знать. – Ngenator

+3

Я использую Django 1.7, и оба случая генерируют тот же запрос: В [19]: str (User.objects.filter (username__isnull = True) .query) == str (User.objects.filter (имя пользователя = нет)) .query) Out [19]: True Итак, я полагаю, вы можете использовать любой из них. – Akhorus

5

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

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 values..Based на этом User.objects.filter(username=None) это будет получать только те значения, где имя пользователя = NULL

+0

Проблема заключается в том, что у меня есть несколько значений для обработки, как ... – Don

+0

Единственная причина, по которой предложил ваше второе условие было, если и хотел обработать None условия и сделать некоторые обработки на нем, то и могли бы использоваться второе решение. Пожалуйста, просмотрите обновленный ответ. – Rajeev

+0

Спасибо. Один из последних вопросов: когда вы говорите: «это будет извлекать только значения, где username = NULL», вы имеете в виду, что Django переводится в «username IS NULL», если это требуется бэкэндом БД? – Don