Django学习之django_debug_toolbar使用

iflreey 2019-12-14

    django_debug_toolbar 是django的第三方工具包,给django扩展了调试功能。包括查看执行的sql语句,db查询次数,request,headers,调试概览等。

安装

使用pip3 install django_debug_toolbar安装
然后修改settings.py和urls.py文件。

修改settings文件

    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‘,
]

修改urls文件

from django.conf import settings
if settings.DEBUG:
    import debug_toolbar
    urlpatterns += [
        url(r‘^__debug__/‘, include(debug_toolbar.urls)),
    ]

访问url即可看到页面

分别点击Settings、Headers、SQL等可以看到相关的详细信息

Django学习之django_debug_toolbar使用

Django学习之django_debug_toolbar使用

    通过查看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 查询优化

相关推荐

inspuryhq / 0评论 2020-07-28