2013-05-03 19 views
22

Ich habe einen queryset durch einen dynamischen Wert filtern (die keine sein kann): kann ich einfach schreiben:Django: Filtern von Abfragegruppen nach 'field__isnull = True' oder 'field = None'?

filtered_queryset = queryset.filter(field=value) 

oder soll ich prüfen None:

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

Hat das Verhalten davon ab, das bestimmte DBMS?

Antwort

27

Das ORM verarbeitet None (NULL) für Sie und gibt ein Objekt QuerySet zurück. Wenn Sie also kein None eingeben, ist das erste Beispiel in Ordnung.

>>> 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 Ich war mir nicht bewusst, dass es" None "so behandelt, sehr nützlich zu wissen. – Ngenator

+3

Ich benutze Django 1.7 und beide Fälle erzeugen die gleiche Abfrage: In [19]: str (Benutzer.objects.filter (username__isnull = True) .query) == str (User.objects.filter (username = None) .query) Out [19]: True Also, ich nehme an, Sie können beide verwenden. – Akhorus

5

Ich ziehe die zweite Lösung, die auf dieser User.objects.filter(username=None) besser

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 

Query-Set behandelt wird, kann Null values..Based behandeln diese nur Werte holen würde, wo username = NULL

+0

Das Problem ist, dass ich mehrere Werte haben wie das zu handhaben ... – Don

+0

Der einzige Grund, die Ihre zweite Bedingung vorgeschlagen wurde, wenn u keine Bedingungen zu handhaben wollte und es einige Verarbeitung tun dann u die verwendet haben könnte zweite Lösung. Bitte sehen Sie die aktualisierte Antwort .. – Rajeev

+0

Danke. Eine letzte Frage: Wenn Sie sagen: "Das würde nur Werte abrufen, bei denen username = NULL ist", meinen Sie, dass Django in "Benutzername IS NULL" übersetzt würde, falls es vom DB-Backend benötigt wird? – Don

Verwandte Themen