¿La forma más rápida de obtener el primer objeto de un conjunto de consultas en django?

A menudo me encuentro con ganas de obtener el primer objeto de un conjunto de consultas en Django, o devolverNone 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 da como resultado 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 de 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?

Respuestas a la pregunta(8)

Su respuesta a la pregunta