web框架_django(調(diào)試工具、orm性能相關)
調(diào)試工具django_debug_toolbar
- 簡介
- django_debug_toolbar是一組可以通過配置進行執(zhí)行過程顯示的面板。
- 安裝
-
pip3 install django-debug-toolbar
-
- 配置
- 1 settings.py中,進行app的注冊。并進行相關配置,INSTALLED_APPS、MIDDLEWARE、INTERNAL_IPS、DEBUG_TOOLBAR_CONFIG
-
settings.py配置INSTALLED_APPS = [ … 'debug_toolbar', ] MIDDLEWARE = [ # ... 'debug_toolbar.middleware.DebugToolbarMiddleware', # ... ] # 如果是本機調(diào)試,還在將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 根據(jù)urls.py中配置的調(diào)試路由,訪問。
- 1 settings.py中,進行app的注冊。并進行相關配置,INSTALLED_APPS、MIDDLEWARE、INTERNAL_IPS、DEBUG_TOOLBAR_CONFIG
orm性能
- 1 連表操作,一般的,直接使用 . 可以直接跨表進行查詢操作,但每執(zhí)行一次,都會進行一次連表操作,效率低
- 解決方式一,降低sql查詢次數(shù),結合values使用連表查詢直接獲取最終數(shù)據(jù),減少直接使用 . 進行連表查詢操作。
-
示例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.但是如果進行關聯(lián)表數(shù)據(jù)的查詢 print(i['classes__id'],i['classes__name']) # 4.首先通過values進行了連表操作,效率就高一些了 return render(request,'index.html',{'all_students':all_students})
-
- 解決方式二,可以通過select_realated提前實現(xiàn)連表。這樣,在使用 . 跨表,就不是每次都進行一遍查詢了
-
示例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之后,里面的參數(shù)寫的是關系字段的名稱,那么就會先進行 # 連表操作,所以sql也是執(zhí)行了一次,效率高一些,但是他用在外鍵或者一對一的關系上 for i in all_students: # print(i.name,i.classes_id) print(i.name,i.classes.id,i.classes.name)
-
- 解決方式三,通過prefetch_related實現(xiàn)子查詢方式,完成連表操作。
-
示例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,里面的參數(shù)寫的是關系字段的名稱,那么會執(zhí)行兩次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查詢次數(shù),結合values使用連表查詢直接獲取最終數(shù)據(jù),減少直接使用 . 進行連表查詢操作。
- only,defer
- 取出來的結果,還是queryset內(nèi)部包含對象,但是,這些對象只包含,only,defer指定的數(shù)據(jù)。
- only指定包含的字段
- defer指定需要排除的字段?! ?/li>
- 示例代碼
-
View Codefrom django.shortcuts import render from app01 import models # Create your views here. def index(request): all_students = models.Student.objects.all().only('name')#只要這個字段數(shù)據(jù) all_students = models.Student.objects.all().defer('name')#排除,除了這個字段其他字段數(shù)據(jù)都要 for i in all_students: print(i.name) return render(request,'index.html',{'all_students':all_students})
-
