问题
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'
回答1:
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.
回答2:
CaptureQueriesContext
will grab the query for you after it's run, and I think works without DEBUG
:
from django.test.utils import CaptureQueriesContext
with CaptureQueriesContext(conn) as queries:
value = User.objects.count()
print(queries.captured_queries[0]['sql'])
回答3:
If DEBUG is on, you can always get the queries executed by Django from the connection object, as described in the documentation.
回答4:
If you just want to see the query, simply install the Django Debug Toolbar: https://github.com/django-debug-toolbar/django-debug-toolbar
来源:https://stackoverflow.com/questions/28652584/how-to-get-count-query-in-django