Відповіді:
Кожен об’єкт QuerySet має query
атрибут, який ви можете ввійти або надрукувати в stdout для цілей налагодження.
qs = Model.objects.filter(name='test')
print qs.query
Редагувати
Я також використовував власні теги шаблонів (як зазначено в цьому фрагменті ) для введення запитів у межах одного запиту як коментарів HTML.
prefetch_related
тобто показувати 2 запити? Я бачу лише 1.
<django.db.models.sql.query.Query object
Ви також можете використовувати протокол 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 .
'level': 'DEBUG'
під 'django.db'
.
Поки DEBUG
він увімкнено:
from django.db import connection
print(connection.queries)
Для індивідуального запиту ви можете:
print(Model.objects.filter(name='test').query)
query
повертає Query
об’єкт, оскільки Djagno 1.2 не має as_sql
атрибута.
Можливо, вам слід поглянути на django-debug-toolbar
додаток, воно записуватиме всі запити для вас, відображатиме інформацію про їх профілювання та багато іншого.
Якщо ви використовуєте маршрутизацію бази даних, у вас, ймовірно, є декілька підключень до бази даних. Цей код дозволяє вам бачити з'єднання під час сеансу. Ви можете скинути статистику так само, як і при одному з'єднанні:reset_queries()
from django.db import connections,connection,reset_queries
...
reset_queries() # resets data collection, call whenever it makes sense
...
def query_all():
for c in connections.all():
print(f"Queries per connection: Database: {c.settings_dict['NAME']} {c.queries}")
# and if you just want to count the number of queries
def query_count_all()->int:
return sum(len(c.queries) for c in connections.all() )
Ви можете використовувати налагоджувальну панель Django для перегляду SQL-запиту. Покрокове керівництво по використанню налагодження налагодження:
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, ви також можете побачити час виконання запиту.