slow select_related querysets query queries practices not create best django sql-execution-plan

select_related - prefetch django



Manera fácil de ejecutar “explicar” en conjuntos de consultas en django (3)

Parece que debería ser fácil de ejecutar "explicar" directamente de un queryset en Django, pero no veo nada obvio sobre cómo hacerlo, y "explicar" es una cosa difícil de buscar en los documentos.


Solo una ligera modificación a la respuesta del guidoísmo. Esto evita que se produzca un ProgrammingError: syntax error at or near ... error causado por los parámetros que no se escapan correctamente en la consulta sin formato:

from django.db import connections from django.db.models.query import QuerySet class QuerySetExplainMixin: def explain(self): cursor = connections[self.db].cursor() query, params = self.query.sql_with_params() cursor.execute(''explain %s'' % query, params) return ''/n''.join(r[0] for r in cursor.fetchall()) QuerySet.__bases__ += (QuerySetExplainMixin,)

Para usarlo, simplemente invoque explique () al final de su consulta, por ejemplo:

print SomeModel.objects.filter(...).explain()


QuerySet.explain() , disponible en Django 2.1.0 y superior, es ahora la forma oficial de explicar las consultas.


Bueno, parece que no hay nada por ahí excepto una barra de herramientas, así que escribí mi propia mezcla para darme un método de explain() en mis consultas:

from django.db import connections from django.db.models.query import QuerySet class QuerySetExplainMixin: def explain(self): cursor = connections[self.db].cursor() cursor.execute(''explain %s'' % str(self.query)) return cursor.fetchall() QuerySet.__bases__ += (QuerySetExplainMixin,)

Esperemos que esto sea útil para otros.