django orm, как просмотреть (или войти) выполненный запрос?


есть ли способ распечатать запрос, который генерирует Django ORM?

скажем, я выполняю следующее утверждение:Model.objects.filter(name='test')

Как я могу увидеть сгенерированный SQL-запрос?

7 134

7 ответов:

каждый объект QuerySet имеет query атрибут, который можно записать или распечатать в stdout для отладки.

qs = Model.objects.filter(name='test')
print qs.query

Edit

Я также использовал пользовательские теги шаблонов (как описано в этот фрагмент) для вставки запросов в область одного запроса в виде комментариев HTML.

вы также можете использовать python logging для регистрации всех запросов, созданных 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:

установить Debug_toolbar

pip install django-debug-toolbar

редактировать settings.py file & add debug_toolbar в установленные приложения, это должно быть добавлено ниже в 'django.ВНО.staticfiles'. Также добавьте debug_toolbar в Middleware.

Settings.py=>

INSTALLED_APPS= [ 'debug_toolbar'] 

MIDDLEWARE = ['debug_toolbar.middleware.DebugToolbarMiddleware']

создать новый список с именем INTERNAL_IPS в settings.py файл

Settings.py=> создать новый список в конце settings.py файл & добавить список ниже:

INTERNAL_IPS= [127.0.0.1']

это позволит отладке работать только на внутреннем сервере разработки

редактировать urls.py файл #Project & add ниже кода:

if settings.DEBUG:
    import debug_toolbar
    urlpatterns = [
    url(r'^__debug__/', include(debug_toolbar.urls))       
    ] + urlpatterns

применить миграцию и снова запустить сервер

вы увидите надстройку на своей веб-странице в 127.0.0.1 & если вы нажмете на флажок SQL Query, вы также можете увидеть время выполнения запроса.