Кажется, должно быть легко запустить "объяснять" непосредственно из набора запросов в Django, но я не вижу ничего очевидного в том, как это сделать, и "объяснить" - это трудная вещь, которую нужно искать в Docs.
Легкий способ запускать "объяснять" на наборах запросов в django
Ответ 1
Ну, похоже, ничего нет, кроме панели инструментов, поэтому я написал свой собственный mixin, чтобы дать мне метод explain()
в моих запросах:
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,)
Надеюсь, это полезно для других.
Ответ 2
Просто небольшое изменение в ответе руководства. Это предотвращает получение ошибки ProgrammingError: syntax error at or near ...
, вызванной неправильным экранированием параметров в необработанном запросе:
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,)
Чтобы использовать, просто вызовите объяснение() в конце вашего набора запросов, например:
print SomeModel.objects.filter(...).explain()