2013-05-03 16 views
22

devo filtrare un set di query da un valore dinamico (che può essere None): posso scrivere semplicemente:Django: filtraggio del queryset per 'field__isnull = True' o 'field = None'?

filtered_queryset = queryset.filter(field=value) 

o devo verificare la presenza di Nessuno:

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

fa il comportamento dipendono il particolare DBMS?

risposta

27

L'ORM gestirà None (convertendolo in NULL) per voi e restituirà un oggetto QuerySet, quindi, a meno che non sia necessario catturare l'input None, il primo esempio va bene.

>>> 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 Non sapevo che gestisse" Nessuno "del genere, molto utile da sapere. – Ngenator

+3

Sto usando Django 1.7 ed entrambi i casi generano la stessa query: In [19]: str (User.objects.filter (username__isnull = True) .query) == str (User.objects.filter (username = Nessuno) .query) Out [19]: True Quindi, suppongo che sia possibile utilizzare entrambi. – Akhorus

5

io preferisco la seconda soluzione che viene gestito meglio

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 

serie di query in grado di gestire Null values..Based su questo User.objects.filter(username=None) questo sarebbe prendere solo valori dove username = NULL

+0

Il problema è che ho diversi valori per gestire così ... – Don

+0

L'unica ragione che ha suggerito la tua seconda condizione era se u voluto per gestire le condizioni Nessuno e fare un po 'di elaborazione su di esso quindi u potrebbe hanno utilizzato il seconda soluzione.Si prega di vedere la risposta aggiornata .. – Rajeev

+0

Grazie. Un'ultima domanda: quando dici "questo recupera solo valori dove username = NULL", vuoi dire che Django si tradurrebbe in "username IS NULL" nel caso in cui sia richiesto dal backend DB? – Don