Respuestas:
Cada objeto QuerySet tiene un query
atributo que puede registrar o imprimir en stdout para fines de depuración.
qs = Model.objects.filter(name='test')
print qs.query
Editar
También he usado etiquetas de plantilla personalizadas (como se describe en este fragmento ) para inyectar las consultas en el ámbito de una sola solicitud como comentarios HTML.
prefetch_related
ejemplo, mostrar 2 consultas? Solo veo 1.
<django.db.models.sql.query.Query object
También puede usar el registro de Python para registrar todas las consultas generadas por Django. Simplemente agregue esto a su archivo de configuración.
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
},
},
}
Otro método en caso de que la aplicación genere una salida html: se puede usar la barra de herramientas de depuración de django .
'level': 'DEBUG'
debajo 'django.db'
.
Mientras DEBUG
esté encendido:
from django.db import connection
print(connection.queries)
Para una consulta individual, puede hacer:
print(Model.objects.filter(name='test').query)
query
devuelve el Query
objeto desde Djagno 1.2 que no tiene as_sql
atributo.
Tal vez debería echar un vistazo a la django-debug-toolbar
aplicación, registrará todas las consultas por usted, mostrará información de perfil para ellas y mucho más.
Si está utilizando el enrutamiento de la base de datos, probablemente tenga más de una conexión de base de datos. Un código como este le permite ver las conexiones en una sesión. Puede restablecer las estadísticas de la misma manera que con una sola conexión: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() )
Puede usar una barra de herramientas debug_tool de Django para ver la consulta SQL. Guía paso a paso para el uso de debug_toolbar:
pip install django-debug-toolbar
Settings.py =>
INSTALLED_APPS= [ 'debug_toolbar']
MIDDLEWARE = ['debug_toolbar.middleware.DebugToolbarMiddleware']
Settings.py => crea una nueva lista al final del archivo settings.py y agrega la lista a continuación:
INTERNAL_IPS= [127.0.0.1']
Esto permitirá que la depuración se ejecute solo en el servidor de desarrollo interno
if settings.DEBUG:
import debug_toolbar
urlpatterns = [
url(r'^__debug__/', include(debug_toolbar.urls))
] + urlpatterns
Verá un complemento en su página web en 127.0.0.1 y si hace clic en la casilla de verificación Consulta SQL, también puede ver el tiempo de ejecución de la consulta.