我希望在请求期间执行的每个查询都有回溯,因此我可以找到他们来自哪里并减少计数/复杂性。
我使用this优秀的中间件片段来列出和查询时间,但我不知道他们来自哪里。
我已经在django/db/models/sql/compiler.py中进行了搜索,但明显的形式是获取django的本地版本并编辑该代码我无法查看如何锁定查询。有没有可以使用的信号?好像有isn't a signal on every query。
是否可以指定默认的Manager
?
(我知道django-toolbar,我希望有一个没有使用它的解决方案。)
答案 0 :(得分:6)
一个丑陋但有效的解决方案(例如,它在所有查询上打印跟踪,只需要一次编辑)就是将以下内容添加到settings.py
的底部:
import django.db.backends.utils as bakutils
import traceback
bakutils.CursorDebugWrapper_orig = bakutils.CursorWrapper
def print_stack_in_project():
stack = traceback.extract_stack()
for path, lineno, func, line in stack:
if 'lib/python' in path or 'settings.py' in path:
continue
print 'File "%s", line %d, in %s' % (path, lineno, func)
print ' %s' % line
class CursorDebugWrapperLoud(bakutils.CursorDebugWrapper_orig):
def execute(self, sql, params=None):
try:
return super(CursorDebugWrapperLoud, self).execute(sql, params)
finally:
print_stack_in_project()
print sql
print '\n\n\n'
def executemany(self, sql, param_list):
try:
return super(CursorDebugWrapperLoud, self).executemany(sql, param_list)
finally:
print_stack_in_project()
print sql
print '\n\n\n'
bakutils.CursorDebugWrapper = CursorDebugWrapperLoud
仍然不确定是否有更优雅的方式来做这件事?
答案 1 :(得分:1)
Django调试工具栏会告诉你你想要什么,壮观的真棒。