如何在django中获取COUNT查询

时间:2015-02-21 23:21:04

标签: python mysql django

要在django中获取查询,我可以这样做:

>>> 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`

但是,如何在执行COUNT时获取它构建的查询?

>>> User.objects.all().count().query
Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'int' object has no attribute 'query'

4 个答案:

答案 0 :(得分:5)

来自docs:

  

<强>计数()

     

返回整数,表示与QuerySet匹配的数据库中的对象数。

因此,不能。

但是,您可以使用django.db.connection.queries来查看和访问当前流程所做的查询。

>>> from django.db import connection
>>> User.objects.count()
>>> print connection.queries

请注意,这仅适用于DEBUG=True且您无法从其他进程访问它们时,您无法在视图之间共享。

最好的选择是使用Django debug toolbar

答案 1 :(得分:0)

如果启用了DEBUG,您可以始终从连接对象获取Django执行的查询,如in the documentation所述。

答案 2 :(得分:0)

如果您只想查看查询,只需安装Django调试工具栏:https://github.com/django-debug-toolbar/django-debug-toolbar

答案 3 :(得分:0)

CaptureQueriesContext将在查询运行后为您抓取查询,我认为在没有DEBUG的情况下可以使用该查询:

from django.test.utils import CaptureQueriesContext
with CaptureQueriesContext(conn) as queries:
    value = User.objects.count()
print(queries.captured_queries[0]['sql'])