iflreey 2019-12-14
django_debug_toolbar 是django的第三方工具包,给django扩展了调试功能。包括查看执行的sql语句,db查询次数,request,headers,调试概览等。
使用pip3 install django_debug_toolbar安装 然后修改settings.py和urls.py文件。
1、添加调试工具App debug_toolbar
INSTALLED_APPS = [ ‘django.contrib.admin‘, ‘django.contrib.auth‘, ‘django.contrib.contenttypes‘, ‘django.contrib.sessions‘, ‘django.contrib.messages‘, ‘django.contrib.staticfiles‘, ‘app01‘, ‘debug_toolbar‘, ]
2、添加调试工具中间件
MIDDLEWARE = [ ....... ‘debug_toolbar.middleware.DebugToolbarMiddleware‘, ]
3、添加调试工具的IP
INTERNAL_IPS = [‘127.0.0.1‘,]
4、debug_toolbar 组件选项
默认值为如下12个组件,可根据需要自行调整。此处不写代表使用默认值。
DEBUG_TOOLBAR_PANELS = [ ‘debug_toolbar.panels.versions.VersionsPanel‘, ‘debug_toolbar.panels.timer.TimerPanel‘, ‘debug_toolbar.panels.settings.SettingsPanel‘, ‘debug_toolbar.panels.headers.HeadersPanel‘, ‘debug_toolbar.panels.request.RequestPanel‘, ‘debug_toolbar.panels.sql.SQLPanel‘, ‘debug_toolbar.panels.staticfiles.StaticFilesPanel‘, ‘debug_toolbar.panels.templates.TemplatesPanel‘, ‘debug_toolbar.panels.cache.CachePanel‘, ‘debug_toolbar.panels.signals.SignalsPanel‘, ‘debug_toolbar.panels.logging.LoggingPanel‘, ‘debug_toolbar.panels.redirects.RedirectsPanel‘, ]
from django.conf import settings if settings.DEBUG: import debug_toolbar urlpatterns += [ url(r‘^__debug__/‘, include(debug_toolbar.urls)), ]
访问url即可看到页面
分别点击Settings、Headers、SQL等可以看到相关的详细信息
通过查看sql可以看到一共执行了多少次sql查询
例子:
from django.shortcuts import render,HttpResponse from app01 import models def index(request): #v = models.User.objects.all() #去除diango自带查询,view中代码和html中代码一共执行1次查询 v = models.User.objects.all().select_related(‘user_type‘) #去除diango自带查询,view中代码和html中代码一共执行1次查询 #v = models.User.objects.all().prefetch_related(‘user_type‘) #去除diango自带查询,view中代码和html中代码一共执行2次查询 return render(request,‘index.html‘,{‘v‘: v})
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {% for item in v %} <p>{{ item.name }} {{ item.email }} {{ item.user_type.name }}</p> {% endfor %} </body> </html>
select_related()当执行它的查询时它沿着外键关系查询关联的对象数据。它会生成一个复杂的查询并引起性能的消耗,但是在以后使用外键关系时将不需要数据库查询。 prefetch_related()返回的也是QuerySet,它将在单个批处理中自动检索每个指定查找的对象。这具有与select_related类似的目的,两者都被设计为阻止由访问相关对象而导致的数据库查询的泛滥,但是策略是完全不同的。 select_related通过创建SQL连接并在SELECT语句中包括相关对象的字段来工作。因此,select_related在同一数据库查询中获取相关对象。然而,为了避免由于跨越“多个‘关系而导致的大得多的结果集,select_related限于单值关系 -外键和一对一关系。 prefetch_related,另一方面,为每个关系单独查找,并在Python中“加入”。这允许它预取多对多和多对一对象,除了外键和一对一关系,它们不能使用select_related来完成。
QuerySet 查询优化