Je dois filtrer un ensemble de requêtes par une valeur dynamique (qui peut être None): puis-je simplement écrire:
filtered_queryset = queryset.filter(field=value)
ou dois-je vérifier 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?
L'ORM gérera None
(transtypez-le en NULL) pour vous et renverra 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'>
>>> str(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
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
L'ensemble de requêtes peut gérer les valeurs Null ... Sur la base de cette User.objects.filter(username=None)
cela ne récupérera que les valeurs où username = NULL