有没有办法记录django视图中的查询总数?

时间:2014-12-03 15:34:37

标签: python django

我有非传统视图响应ajax请求。通常,我使用调试工具栏来获取查询计数,但是,由于此特定视图只是返回一些json,因此调试工具栏无法显示自己的页面。

有没有办法将视图中执行的总查询打印到控制台?

通过浏览文档,找到qs.query。但是,这只是给我的基本orm查找。我真的在寻找我视图中发生的所有事情的总和(例如,通过遍历外键触发的其他查询)。

2 个答案:

答案 0 :(得分:5)

您可以为此目的编写中间件:

from django.db import connection
class SqlPrintMiddleware(object):
    def process_response(self, request, response):
        sqltime = 0 # Variable to store execution time
        for query in connection.queries:
            sqltime += float(query["time"])  # Add the time that the query took to the total

        # len(connection.queries) = total number of queries
        print "Page render: " + unicode(sqltime) + "sec for " + unicode(len(connection.queries)) + " queries"

        return response

在你的settings.py中更改:

MIDDLEWARE_CLASSES = (
    # ...
    'your_app.middleware.SqlPrintMiddleware',
    # ...
)

来自here

的想法

答案 1 :(得分:0)

以下是一种快速而肮脏的方法,用于计算 Django 请求-响应周期内进行的数据库调用次数

创建以下函数

from django.db import connection
def calculate_db_response_time():
    sqltime = 0.0 # Variable to store execution time
    for query in connection.queries:
        sqltime += float(query["time"])  # Add the time that the query took to the total
    print("Page render: "+ str(sqltime)+ "sec for "+ str(len(connection.queries))+ " queries")

在您的视图中返回响应之前调用 calculate_db_response_time() 函数。
PS:请确保执行此函数后没有其他数据库调用


在项目级别实现此目的的另一种方法是按照 #wolendranh 答案的建议创建以下中间件。

以下代码段是 #wolendranh 提供的答案的 3.X python 版本。
以下代码段可以创建为中间件

from django.db import connection
class SqlPrintMiddleware(object):
    def process_response(self, request, response):
        sqltime = 0.0 # Variable to store execution time
        for query in connection.queries:
            sqltime += float(query["time"])  # Add the time that the query took to the total
        # len(connection.queries) = total number of queries
        print("Page render: "+ str(sqltime)+ "sec for "+ str(len(connection.queries))+ " queries")
        return response

并在您的 settings.py 中更改:

MIDDLEWARE_CLASSES = (
    # ...
    'your_app.middleware.SqlPrintMiddleware',
    # ...
)