select_related - Django: filtrado queryset por ''field__isnull=True'' o ''field=None''?
select_related django example (2)
El ORM manejará None
(convertirlo a NULL) para usted y devolverá un objeto QuerySet
, de modo que a menos que necesite capturar None
el primer ejemplo está bien.
>>> 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
Tengo que filtrar un conjunto de preguntas por un valor dinámico (que puede ser Ninguno): puedo simplemente escribir:
filtered_queryset = queryset.filter(field=value)
o debo verificar Ninguno:
if value is None:
filtered_queryset = queryset.filter(field__isnull=True)
else:
filtered_queryset = queryset.filter(field=value)
¿El comportamiento depende del DBMS particular?
Prefiero la segunda solución que se maneja mejor
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
El conjunto de consultas puede manejar valores nulos. De acuerdo con este User.objects.filter(username=None)
esto solo obtendría valores donde username = NULL