Respostas:
Cada objeto QuerySet possui um query
atributo que você pode registrar ou imprimir no stdout para fins de depuração.
qs = Model.objects.filter(name='test')
print qs.query
Editar
Também usei tags de modelo personalizadas (conforme descrito neste snippet ) para injetar as consultas no escopo de uma única solicitação como comentários em HTML.
prefetch_related
mostrar 2 consultas? Eu vejo apenas 1.
<django.db.models.sql.query.Query object
Você também pode usar o log python para registrar todas as consultas geradas pelo Django. Basta adicionar isso ao seu arquivo de configurações.
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
},
},
}
Outro método, caso o aplicativo esteja gerando saída html - a barra de ferramentas de depuração do django pode ser usada.
'level': 'DEBUG'
abaixo 'django.db'
.
Enquanto DEBUG
estiver ligado:
from django.db import connection
print(connection.queries)
Para uma consulta individual, você pode:
print(Model.objects.filter(name='test').query)
query
retorna o Query
objeto desde o Djagno 1.2, que não possui as_sql
atributo.
Talvez você deva dar uma olhada no django-debug-toolbar
aplicativo, ele registrará todas as consultas para você, exibirá informações de perfil para elas e muito mais.
Se você estiver usando o roteamento de banco de dados, provavelmente terá mais de uma conexão com o banco de dados. Um código como esse permite ver as conexões em uma sessão. Você pode redefinir as estatísticas da mesma maneira que em uma única conexão: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() )
Você pode usar um debango_toolbar do Django para visualizar a consulta SQL. Guia passo a passo para o uso de debug_toolbar:
pip install django-debug-toolbar
Settings.py =>
INSTALLED_APPS= [ 'debug_toolbar']
MIDDLEWARE = ['debug_toolbar.middleware.DebugToolbarMiddleware']
Settings.py => crie uma nova lista no final do arquivo settings.py e adicione a lista abaixo:
INTERNAL_IPS= [127.0.0.1']
Isso permitirá que a depuração seja executada apenas no servidor de desenvolvimento interno
if settings.DEBUG:
import debug_toolbar
urlpatterns = [
url(r'^__debug__/', include(debug_toolbar.urls))
] + urlpatterns
Você verá um complemento na sua página da Web em 127.0.0.1 e, se clicar na caixa de seleção Consulta SQL, poderá ver também o tempo de execução da consulta.