Django學習——分組查詢、圖書管理系統項目、wsgi, uwsgi, cgi, fastcgi
1 分組查詢
# 分組查詢
# 查詢每一個出版社id,以及圖書平均價格(單表)
# 原生sql
# select publish_id,avg(price) from app01_book group by publish_id;
# orm 實現
"""標準 annotate() 內寫聚合函數 QuerySet對象的方法
values在前,表示group by 的欄位
values在後,表示取欄位
filter在前,表示where條件
filter在後,表示having 分組之後
"""
from django.db.models import Avg,Sum,Count,Max
# res = models.Book.objects.all().values('publish_id').annotate(price_avg=Avg('price')).values('publish_id','price_avg')
# print(res)
# 查詢出版社id大於1的出版社id,以及出書平均價格
# res = models.Book.objects.values('publish_id').filter(publish_id__gt=1).annotate(price_avg=Avg('price')).values('publish_id','price_avg')
# print(res)
# 查詢出版社id大於1的出版社id,以及出書平均價格大於30的
# res = models.Book.objects.values('publish_id').filter(publish_id__gt=1).annotate(price_avg=Avg('price')).filter(price_avg__gt=30).values('publish_id','price_avg')
# print(res)
# 查詢每一個出版社出版的名稱和書籍個數(連表)
# 連表的話最好以group by的表作為主表
# 最後一個values只能取Publish表中的欄位和annotate中的欄位
# res = models.Publish.objects.values('nid').annotate(book_count=Count('book__nid')).values('name','book_count')
# 簡寫 如果基表是group by 的表,就可以不寫values
# res = models.Publish.objects.annotate(book_count=Count('book')).values('name','book_count')
# 以book為基表
# res = models.Book.objects.values('publish__nid').annotate(book_count=Count('nid')).values('publish__name','book_count')
# print(res)
# 查詢每個作者的名字,以及出版過書籍的最高價格(建議使用分組的表作為基表)
# 多對多如果不以分組表為基表,可能會出數據問題
# res = models.Author.objects.annotate(price_max=Max('book__price')).values('name','price_max')
# res = models.Book.objects.values('authors__nid').annotate(price_max=Max('price')).values('authors__name','price_max')
# print(res)
# 查詢每一個書籍的名稱,以及對應的作者個數
# res = models.Book.objects.annotate(author_count=Count('authors__name')).values('name','author_count')
# res = models.Book.objects.annotate(author_count=Count('authors')).values('name','author_count')
# print(res)
# 統計不止一個作者的圖書
# res = models.Book.objects.annotate(author_count=Count('authors')).filter(author_count__gt=1).values('name','author_count')
# print(res)
# 統計價格數大於10元,作者的圖書
# res = models.Book.objects.values('price').filter(price__gt=10).annotate(author_count=Count('authors')).values('name','author_count')
# res = models.Book.objects.filter(price__gt=10).annotate(author_count=Count('authors')).values('name','author_count')
# print(res)
# 統計價格數大於10元,作者個數大於1的圖書
# res = models.Book.objects.values('price').filter(price__gt=10).annotate(author_count=Count('authors')).filter(author_count__gt=1).values('name')
# res = models.Book.objects.filter(price__gt=10).annotate(author_count=Count('authors')).filter(author_count__gt=1).values('name','price','author_count')
# print(res)
2 圖書管理系統項目
1 後端是django+mysql/sqlite
2 前端:jquery,bootstrap
3 首頁,圖書列表展示,圖書新增,修改,作者展示,新增,修改,出版社展示,新增,修改...
4 項目地址://gitee.com/liuqingzheng/books
補充
1 wsgi, uwsgi, cgi, fastcgi
瀏覽器只能發出HTTP的請求
本質上:瀏覽器是一個socket客戶端,伺服器是一個socket服務端
web伺服器性能的高低決定了整個項目性能的高低
請求對象environment 字典 =》 request對象=》Django框架()
start_response響應對象
python:有wsgi協議,uwsgi,gunicorn
java:Tomcat,Jboss
php:php伺服器
wsgi:協議,規定了如何拆HTTP請求,拆到一個python字典中,
environment,響應對象,start_response
wsgiref:符合wsgi協議的web伺服器
CGI:通用網關介面。一句話總結:一個標準,定義了客戶端伺服器之間如何傳數據
FastCGI:快速通用網關介面。一句話總結:CGI的升級版
WSGI:Web伺服器網關介面。一句話總結:為python定義的web伺服器和web框架之間的介面標準
uWSGI:用c語言寫的,性能比較高 一句話總結:一個Web Server,即一個實現了WSGI的伺服器,大體和Apache是一個類型的東西,處理髮來的請求
uwsgi:是一種通訊協議 uWSGI自有的協議
詳情見://liuqingzheng.top/article/1/05-CGI,FastCGI,WSGI,uWSGI,uwsgi%E4%B8%80%E6%96%87%E6%90%9E%E6%87%82/
# asgi協議 非同步服務網關介面
回顧
1 分組查詢
-把同一類歸為一組,然後使用聚合函數操作
-如果是多表,把兩個表連起來,再分組,再聚合
-取得欄位必須是分組欄位或者聚合函數的欄位
如果是單表只能取分組欄位和聚合函數聚合的欄位
如果是多表可以取分組表中的所有欄位和聚合函數的欄位
-總結:
-annotate(聚合函數)
-values在前,表示分組欄位
-values在後,表示取欄位
-filter在前,表示where條件
-filter在後,表示having條件
2 wsgi,uWSGI,uwsgi,cgi,fastcgi
3 前後端開發模式
-動態網站(網頁的內容是由資料庫渲染過來的 每次刷新都不一樣)和靜態網站(一個死頁面 不變)
-前後端分離:後端只寫後端,返回json格式字元串,js語言 DOM vue react
-前後端混合開發:模板,dtl(模板語法 本質就是字元串的替換),jsp,php
4 圖書管理系統
-後端是Django+mysql+bootstrap (主機管理系統,人事管理系統,文檔分享平台)
-圖書增刪查改
-增,刪,查
-出版社的增刪查改
-作者的增刪查改
頁面靜態化
