¿Cuál es el idioma recomendado para verificar si una consulta arrojó algún resultado?
Ejemplo:
orgs = Organisation.objects.filter(name__iexact = 'Fjuk inc')
# If any results
# Do this with the results without querying again.
# Else, do something else...
Supongo que hay varias formas diferentes de verificar esto, pero me gustaría saber cómo lo haría un usuario experimentado de Django. La mayoría de los ejemplos en los documentos simplemente ignoran el caso donde no se encontró nada ...
django
django-queryset
Niklas
fuente
fuente
list
resultado si hay registros. El código allí llegará a la base de datos solo una vez. Si solíanexist()
ocount()
para verificar primero si va a haber registros devueltos, estarían presionando la base de datos dos veces (una para verificar, una para obtener los registros). Esta es una situación específica. No implica que, en el caso general , el método preferido para saber si una consulta devolverá registros es usar doif queryset:...
if not my_objects:
para demostrar que así es como lo hacen en los documentos. Todo lo demás es completamente irrelevante, así que no entiendo tu punto. También podrían hacer miles de consultas y aún sería totalmente irrelevante ya que este no es el punto de esta respuesta, con lo que dejo en claro que estoy de acuerdo.get_object_or_404
funciona, no una forma preferida de verificar si existe algún elemento en un conjunto de consultas. Hacer list () en un conjunto de consultas buscará todos los objetos en un conjunto de consultas, lo que sería peor que consultar dos veces si se devuelven muchas filas..exists()
es más eficiente si no se va a evaluar el qs.Desde la versión 1.2, Django tiene QuerySet. existe () método que es el más eficiente:
Pero si va a evaluar QuerySet de todos modos, es mejor usar:
Para obtener más información, lea la documentación de QuerySet.exists () .
fuente
.get
no devuelve un conjunto de consultas. Devuelve un objeto. Entonces google para esoSi tiene una gran cantidad de objetos, esto puede (a veces) ser mucho más rápido:
En un proyecto en el que estoy trabajando con una gran base de datos,
not orgs
tiene más de 400 ms yorgs.count()
250 ms. En mis casos de uso más comunes (aquellos en los que hay resultados), esta técnica a menudo lo reduce a menos de 20 ms. (Un caso que encontré fue 6).Podría ser mucho más largo, por supuesto, dependiendo de qué tan lejos tenga que buscar la base de datos para encontrar un resultado. O incluso más rápido, si encuentra uno rápidamente; YMMV.
EDITAR: Esto a menudo será más lento que
orgs.count()
si no se encuentra el resultado, particularmente si la condición en la que está filtrando es rara; Como resultado, es particularmente útil en las funciones de vista donde necesita asegurarse de que la vista existe o lanzar Http404. (Donde, uno esperaría, la gente está pidiendo URL que existen con mayor frecuencia).fuente
Para verificar el vacío de un conjunto de consultas:
o puede buscar el primer elemento en un conjunto de consultas, si no existe devolverá
None
:fuente
if orgs.exists()
fue cubierto por una respuesta que se proporcionó unos 5 años antes de esta. Lo único que aporta esta respuesta a la tabla, que tal vez sea nuevo, esif orgs.first()
. (Incluso esto es discutible: ¿es sustancialmente diferente de hacer loorgs[0]
sugerido hace aproximadamente 5 años también?) Debería desarrollar esa parte de la respuesta: ¿cuándo querría hacer esto en lugar de las otras soluciones propuestas anteriormente?La forma más eficiente (antes de django 1.2) es esta:
fuente
No estoy de acuerdo con el predicado
Debería ser
Estaba teniendo el mismo problema con un conjunto de resultados bastante grande (~ 150k resultados). El operador no está sobrecargado en QuerySet, por lo que el resultado en realidad se desempaqueta como una lista antes de realizar la verificación. En mi caso, el tiempo de ejecución se redujo en tres órdenes.
fuente
También puedes usar esto:
if(not(orgs)): #if orgs is empty else: #if orgs is not empty
fuente