To get a query in django I can do:
>>> print User.objects.all().query
SELECT `auth_user`.`id`, `auth_user`.`username`, `auth_user`.`first_name`, `auth_user`.`last_name`, `auth_user`.`email`, `auth_user`.`password`, `auth_user`.`is_staff`, `auth_user`.`is_active`, `auth_user`.`is_superuser`, `auth_user`.`last_login`, `auth_user`.`date_joined`
FROM `auth_user`
However, how would I get the query it builds when doing a COUNT?
>>> User.objects.all().count().query
Traceback (most recent call last):
File "<console>", line 1, in <module>
AttributeError: 'int' object has no attribute 'query'
From docs:
count()
Returns an integer representing the number of objects in the database matching the QuerySet.
Thus, you can't.
However, you can make use of django.db.connection.queries
in order to see and access the queries that are made by the current process.
>>> from django.db import connection
>>> User.objects.count()
>>> print connection.queries
Note that, this works only when DEBUG=True
and you can't access them from another process, you can't share between views.
The best option would be to use the Django debug toolbar.
CaptureQueriesContext
will grab the query for you after it's run, and I think works without DEBUG
:
from django.test.utils import CaptureQueriesContext
from django.db import connection
with CaptureQueriesContext(connection) as queries:
value = User.objects.count()
print(queries.captured_queries[0]['sql'])
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With