我有非传统视图响应ajax请求。通常,我使用调试工具栏来获取查询计数,但是,由于此特定视图只是返回一些json,因此调试工具栏无法显示自己的页面。
有没有办法将视图中执行的总查询打印到控制台?
通过浏览文档,找到qs.query
。但是,这只是给我的基本orm查找。我真的在寻找我视图中发生的所有事情的总和(例如,通过遍历外键触发的其他查询)。
答案 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',
# ...
)