tutorial template examples bootstrap django django-queryset

template - Comprobación de consultas vacías en Django



template django tutorial (6)

¿Cuál es el modismo 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 maneras 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 ...


Desde la versión 1.2, Django tiene QuerySet. exists() método exists() que es el más eficiente:

if orgs.exists(): # Do this... else: # Do that...

Pero si vas a evaluar QuerySet de todos modos, es mejor usar:

if orgs: ...

Para obtener más información, exists() .


La forma más eficiente (antes de django 1.2) es esta:

if orgs.count() == 0: # no results else: # alrigh! let''s continue...


No estoy de acuerdo con el predicado

if not orgs:

Debería ser

if not orgs.count():

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 se desempaqueta como una lista antes de realizar la verificación. En mi caso, el tiempo de ejecución disminuyó en tres órdenes.


Para verificar el vacío de un conjunto de preguntas:

if orgs.exists(): # Do something

o puede verificar el primer elemento en un conjunto de consulta, si no existe, devolverá None :

if orgs.first(): # Do something


Si tiene una gran cantidad de objetos, esto (a veces) puede ser mucho más rápido:

try: orgs[0] # If you get here, it exists... except IndexError: # Doesn''t exist!

En un proyecto en el que estoy trabajando con una enorme base de datos, not orgs es 400+ ms y orgs.count() es 250ms. En mis casos de uso más comunes (aquellos donde hay resultados), esta técnica a menudo baja a menos de 20 ms. (Un caso que encontré, fue 6.)

Podría ser mucho más largo, por supuesto, dependiendo de cuánto debe 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 visualización donde necesita asegurarse de que la vista exista o lanzar Http404. (Donde, uno esperaría, las personas están pidiendo URLs que existen más de las veces).


if not orgs: # Do this... else: # Do that...