Tutorial :django orm, how to view (or log) the executed query?


Is there a way I can print the query the Django ORM is generating?

Say I execute the following statement: Model.objects.filter(name='test')

How do I get to see the generated SQL query?


Each QuerySet object has a query attribute that you can log or print to stdout for debugging purposes.

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


I've also used custom template tags (as outlined in this snippet) to inject the queries in the scope of a single request as HTML comments.


You also can use python logging to log all queries generated by Django. Just add this to your settings file.

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          },      },  }  

Another method in case application is generating html output - django debug toolbar can be used.


You can paste this code on your interpreter which will display all the SQL queries:

# 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())  


As long as DEBUG is on:

from django.db import connection  print connection.queries  

For an individual query, you can do:

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


Maybe you should take a look at django-debug-toolbar application, it will log all queries for you, display profiling information for them and much more.


A robust solution would be to have your database server log to a file and then

tail -f /path/to/the/log/file.log  


You can use a Django debug_toolbar to view the SQL query. Step by step guide for debug_toolbar usage :

Install the Debug_toolbar

pip install django-debug-toolbar  

Edit settings.py file & add debug_toolbar to Installed apps, this should be added below to 'django.contrib.staticfiles'. Also add debug_toolbar to Middleware.


INSTALLED_APPS= [ 'debug_toolbar']     MIDDLEWARE = ['debug_toolbar.middleware.DebugToolbarMiddleware']  

create a new list named INTERNAL_IPS in settings.py file

Settings.py=> create new list at the end of settings.py file & add below list:


This will allow the debug to run only on internal developement server

Edit urls.py file of #Project & add below code:

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

apply migrate & run server again

You will see an add-on on your web page at & if you click on SQL Query check box, you can actually see the run time of query as well.

Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
Next Post »