por - tuplas y diccionarios en python




¿La forma más rápida de obtener el primer objeto de un conjunto de consulta en django? (6)

Ahora, en Django 1.9, tienes el método first() para querysets.

YourModel.objects.all().first()

Esta es una mejor manera que .get() o [0] porque no arroja una excepción si el conjunto de consulta está vacío. Por lo tanto, no es necesario que compruebe el uso de exists()

A menudo me parece que quiero obtener el primer objeto de un queryset en Django, o devolver None si no hay ninguno. Hay muchas formas de hacer esto que funcionan. Pero me pregunto cuál es el más eficiente.

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 ¿Esto es 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 muy intensiva en memoria cuando todo lo que realmente necesita es una prueba trivial.

¿Cómo puedo hacer esto con solo una llamada a la base de datos y sin agitar la memoria con objetos de excepción?


Deberías usar los métodos django, como existe. Está ahí para que lo uses.

if qs.exists():
    return qs[0]
return None

La respuesta correcta es

Entry.objects.all()[:1].get()

Que se puede usar en:

Entry.objects.filter()[:1].get()

No querría convertirlo primero en una lista porque eso forzaría una llamada a la base de datos completa de todos los registros. Simplemente haz lo anterior y solo extraerá el primero. Incluso podría usar .order_by para asegurarse de obtener el primero que desea.

Asegúrese de agregar .get() o de lo contrario obtendrá un QuerySet y no un objeto.


Puede ser así

obj = model.objects.filter(id=emp_id)[0]

o

obj = model.objects.latest('id')


r = list(qs[:1])
if r:
  return r[0]
return None




django-models