【问题标题】:How to get COUNT query in django如何在 Django 中获取 COUNT 查询
【发布时间】:2015-04-23 12:36:26
【问题描述】:

要在 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'

【问题讨论】:

    标签: python mysql django


    【解决方案1】:

    来自docs:

    count()

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

    因此,您不能。

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

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

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

    最好的选择是使用Django debug toolbar

    【讨论】:

    • 我明白这一点。有没有办法查看 django 生成的查询以获取计数?
    【解决方案2】:

    CaptureQueriesContext 将在运行后为您获取查询,我认为没有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'])
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2020-01-09
          • 2015-02-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-30
          • 1970-01-01
          • 2020-03-11
          • 1970-01-01
          相关资源
          最近更新 更多