Django: filtrage queryset par 'field isnull=True' ou 'field = None'?

Je dois filtrer un queryset par une valeur dynamique( qui peut être None): puis-je simplement écrire:

filtered_queryset = queryset.filter(field=value)

Ou dois-je vérifier pour Aucun:

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

Le comportement dépend-il du SGBD particulier?

23
demandé sur Don 2013-05-03 13:03:45

2 réponses

L'ORM va gérer None (Le convertir en NULL) pour vous et retourner un objet QuerySet, donc à moins que vous n'ayez besoin d'attraper l'entrée None, le premier exemple est correct.

>>> 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
29
répondu Hedde van der Heide 2013-05-03 09:20:45

Je préfère la deuxième solution qui est mieux gérée

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

Requête peut gérer les valeurs Null..Basé sur ceci User.objects.filter(username=None) cela ne récupérerait que des valeurs où username = NULL

5
répondu Rajeev 2013-05-06 05:41:39