web框架_django(调试工具、orm性能相关)
调试工具django_debug_toolbar
- 简介
- django_debug_toolbar是一组可以通过配置进行执行过程显示的面板。
- 安装
-
pip3 install django-debug-toolbar
-
- 配置
- 1 settings.py中,进行app的注册。并进行相关配置,INSTALLED_APPS、MIDDLEWARE、INTERNAL_IPS、DEBUG_TOOLBAR_CONFIG
-
INSTALLED_APPS = [ … 'debug_toolbar', ] MIDDLEWARE = [ # ... 'debug_toolbar.middleware.DebugToolbarMiddleware', # ... ] # 如果是本机调试,还在将127.0.0.1加入 INTERNAL_IPS INTERNAL_IPS = [‘127.0.0.1’, ] # 配置jQquery,默认的是google的jquery,改成过程的cdn加速 DEBUG_TOOLBAR_CONFIG = { "JQUERY_URL": '//cdn.bootcss.com/jquery/2.2.4/jquery.min.js', } #如果在Django项目中使用了jquery的话就可以直接将这一项置为空,那么django-debug-toolbar 就会使用你项目中用到的jquery: DEBUG_TOOLBAR_CONFIG = { "JQUERY_URL": '', }
2 urls.py中,进行路由配置,如果有
-
-
from django.conf import settings from django.conf.urls import include, url if settings.DEBUG: import debug_toolbar urlpatterns = [ url(r'^__debug__/', include(debug_toolbar.urls)), ] + urlpatterns
- 3 根据urls.py中配置的调试路由,访问。
- 1 settings.py中,进行app的注册。并进行相关配置,INSTALLED_APPS、MIDDLEWARE、INTERNAL_IPS、DEBUG_TOOLBAR_CONFIG
orm性能
- 1 连表操作,一般的,直接使用 . 可以直接跨表进行查询操作,但每执行一次,都会进行一次连表操作,效率低
- 解决方式一,降低sql查询次数,结合values使用连表查询直接获取最终数据,减少直接使用 . 进行连表查询操作。
-
from django.shortcuts import render from app01 import models # Create your views here. def index(request): all_students = models.Student.objects.all().values('classes__id','classes__name') # all_students = models.Student.objects.all() for i in all_students: # print(i.name,i.classes_id) # 1.通过django-debug-toolbar可以看到 # 查询本表子段的时候用到了一次sql查询 # print(i.name,i.classes.id,i.classes.name) # 2.但是如果进行关联表数据的查询 print(i['classes__id'],i['classes__name']) # 4.首先通过values进行了连表操作,效率就高一些了 return render(request,'index.html',{'all_students':all_students})
-
- 解决方式二,可以通过select_realated提前实现连表。这样,在使用 . 跨表,就不是每次都进行一遍查询了
-
from django.shortcuts import render from app01 import models # Create your views here. def index(request): all_students = models.Student.objects.all().select_related('classes') # 使用了select_related之后,里面的参数写的是关系字段的名称,那么就会先进行 # 连表操作,所以sql也是执行了一次,效率高一些,但是他用在外键或者一对一的关系上 for i in all_students: # print(i.name,i.classes_id) print(i.name,i.classes.id,i.classes.name)
-
- 解决方式三,通过prefetch_related实现子查询方式,完成连表操作。
-
from django.shortcuts import render from app01 import models # Create your views here. def index(request): all_students = models.Student.objects.all().prefetch_related('classes') # prefetch_related,里面的参数写的是关系字段的名称,那么会执行两次sql,子查询的效果,但是支持外键或一对一或者一对多的查询了 for i in all_students: # print(i.name,i.classes_id) print(i.name,i.classes.id,i.classes.name) return render(request,'index.html',{'all_students':all_students})
-
- 解决方式一,降低sql查询次数,结合values使用连表查询直接获取最终数据,减少直接使用 . 进行连表查询操作。
- only,defer
- 取出来的结果,还是queryset内部包含对象,但是,这些对象只包含,only,defer指定的数据。
- only指定包含的字段
- defer指定需要排除的字段。
- 示例代码
-
from django.shortcuts import render from app01 import models # Create your views here. def index(request): all_students = models.Student.objects.all().only('name')#只要这个字段数据 all_students = models.Student.objects.all().defer('name')#排除,除了这个字段其他字段数据都要 for i in all_students: print(i.name) return render(request,'index.html',{'all_students':all_students})
-