How to get COUNT query in django

我只是一个虾纸丫 提交于 2021-02-20 08:30:46

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!