2013-05-03 19 views
22

muszę filtrować queryset przez wartość dynamicznej (które mogą być None): może po prostu napisać:Django: filtrowanie zapytań według "field__isnull = True" lub "field = None"?

filtered_queryset = queryset.filter(field=value) 

czy mam sprawdzić None:

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

Czy zachowanie zależy od konkretny DBMS?

Odpowiedz

27

ORM obsłuży dla ciebie None (wyrzuci go do NULL) i zwróci obiekt QuerySet, więc jeśli nie musisz przechwytywać wejścia None, pierwszy przykład jest w porządku.

>>> 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 Nie wiedziałem, że jest obsługiwane" Brak "w tym stylu, bardzo przydatne. – Ngenator

+3

Używam Django 1.7 i oba przypadki generują to samo zapytanie: W [19]: str (User.objects.filter (nazwa_użytkownika__isnull = True) .query) == str (User.objects.filter (nazwa użytkownika = brak) .query) Outlet [19]: True Tak więc, przypuszczam, że możesz użyć albo. – Akhorus

5

wolę to drugie rozwiązanie, które jest obsługiwane lepsze

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 

zestaw zapytań może obsługiwać Null values..Based na tej User.objects.filter(username=None) ten będzie pobierał tylko wartości gdzie username = NULL

+0

Problem polega na tym, że mam kilka wartości do obsługi tak ... – Don

+0

Jedynym powodem, który zaproponował swoją Drugim warunkiem było, jeśli u chciał obsłużyć Brak Warunki i zrobić niektóre przetwarzania na nim, a następnie u mógł używany drugie rozwiązanie. Sprawdź zaktualizowaną odpowiedź. – Rajeev

+0

Dzięki. Ostatnie pytanie: kiedy powiesz "to by pobierały tylko wartości gdzie username = NULL", masz na myśli to, że Django przełożyłoby się na "username IS NULL" na wypadek, gdyby było wymagane przez backend DB? – Don

Powiązane problemy