A menudo me encuentro con ganas de obtener el primer objeto de un conjunto de consultas en Django, o regresar None
si no hay ninguno. Hay muchas maneras de hacer esto que funcionan. Pero me pregunto cuál es el más eficaz.
qs = MyModel.objects.filter(blah = blah)
if qs.count() > 0:
return qs[0]
else:
return None
¿Esto resulta en dos llamadas a la base de datos? Eso parece un desperdicio. ¿Es esto más rápido?
qs = MyModel.objects.filter(blah = blah)
if len(qs) > 0:
return qs[0]
else:
return None
Otra opción sería:
qs = MyModel.objects.filter(blah = blah)
try:
return qs[0]
except IndexError:
return None
Esto genera una sola llamada a la base de datos, lo cual es bueno. Pero requiere crear un objeto de excepción la mayor parte del tiempo, lo cual es una tarea que requiere mucha memoria cuando todo lo que realmente necesita es una prueba trivial if.
¿Cómo puedo hacer esto con una sola llamada a la base de datos y sin agitar la memoria con objetos de excepción?
first()
y last()
conveniencia métodos: docs.djangoproject.com/en/dev/ref/models/querysets/#first
len()
en conjuntos de consultas, use siempre.count()
.