Есть ли способ распечатать запрос, который генерирует ORM Django?
Скажем, я выполняю следующий оператор: Model.objects.filter(name='test')
Как мне получить сгенерированный SQL-запрос?
Есть ли способ распечатать запрос, который генерирует ORM Django?
Скажем, я выполняю следующий оператор: Model.objects.filter(name='test')
Как мне получить сгенерированный SQL-запрос?
Каждый объект QuerySet имеет атрибут query, который вы можете записывать или печатать в stdout для целей отладки.
qs = Model.objects.filter(name='test')
print qs.query
Edit
Я также использовал пользовательские теги шаблонов (как описано в этот фрагмент), чтобы вводить запросы в область одного запроса как HTML комментарии.
Вы также можете использовать ведение журнала python для регистрации всех запросов, сгенерированных Django. Просто добавьте это в свой файл настроек.
LOGGING = {
    'disable_existing_loggers': False,
    'version': 1,
    'handlers': {
        'console': {
            # logging handler that outputs log messages to terminal
            'class': 'logging.StreamHandler',
            'level': 'DEBUG', # message level to be written to console
        },
    },
    'loggers': {
        '': {
            # this sets root level logger to log debug and higher level
            # logs to console. All other loggers inherit settings from
            # root level logger.
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False, # this tells logger to send logging message
                                # to its parent (will send if set to True)
        },
        'django.db': {
            # django also has database level logging
        },
    },
}
Другой метод, если приложение генерирует вывод html - панель инструментов отладки django.
Вы можете вставить этот код в свой интерпретатор, который отобразит все SQL-запросы:
# To get all sql queries sent by Django from py shell
import logging
l = logging.getLogger('django.db.backends')
l.setLevel(logging.DEBUG)
l.addHandler(logging.StreamHandler())
 Пока DEBUG:
from django.db import connection
print(connection.queries)
Для отдельного запроса вы можете сделать:
print(Model.objects.filter(name='test').query)
Возможно, вам стоит взглянуть на приложение django-debug-toolbar, оно будет регистрировать все запросы для вас, отображать данные профилирования для них и многое другое.
Надежным решением было бы иметь доступ к вашему серверу базы данных в файл, а затем
tail -f /path/to/the/log/file.log
Вы можете использовать Django debug_toolbar для просмотра SQL-запроса. Пошаговое руководство по использованию debug_toolbar:
pip install django-debug-toolbar
Settings.py = >
INSTALLED_APPS= [ 'debug_toolbar'] 
MIDDLEWARE = ['debug_toolbar.middleware.DebugToolbarMiddleware']
Settings.py = > создать новый список в конце файла settings.py и добавить список ниже:
INTERNAL_IPS= [127.0.0.1']
Это позволит отладке работать только на внутреннем сервере разработки
if settings.DEBUG:
    import debug_toolbar
    urlpatterns = [
    url(r'^__debug__/', include(debug_toolbar.urls))       
    ] + urlpatterns
Вы увидите надстройку на своей веб-странице в 127.0.0.1, и если вы нажмете на SQL Query, вы также можете увидеть время выполнения запроса.