多表操作,常用非常用欄位
阿新 • • 發佈:2018-11-14
1基於雙下劃線的跨表查詢
套路一樣,用__跨表
-一對多
-多對多
2 聚合查詢
-聚合函式
from django.db.models import Avg,Count,Max,Min,Sum
# 計算所有圖書的平均價格
# ret=Book.objects.all().aggregate(Avg('price'))
# print(ret)
3分組查詢
終極總結:
values在前,表示group by,在後,表示取值
filter在前,表示過濾(where),在後,表示having(對分組之後的結果再進行過濾)
4 F查詢與Q查詢
-F為了欄位=後面的值,不能放欄位,所以用F函式包裹一下就可以了
-Q為了構造與&,或|,非~的關係
5 常用欄位:必須記住,非常用欄位,瞭解即可
6 orm欄位引數:
-null 可以為空
-unique 唯一性約束
-default 預設值
-db_index 為該欄位建索引
-只給日期型別和時間型別用
-auto_now_add 新增資料時,預設把當前時間存入
-auto_now 修改的時候,預設把當前時間存入
7 關係欄位
ForeignKey
-to 關聯哪個表
-to_field 關聯的欄位
-related_name 反向操作時,使用的欄位名,用於代替原反向查詢時的'表名_set'。(一般不要用)
-related_query_name :基於雙下劃線的反向查詢之前按表名小寫(一般不要用)
-on_delete:models.CASCADE,models.SET_NULL
-db_constraint:db_constraint=False代表,不做外來鍵關聯
程式碼;
import os if __name__ == '__main__': os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day77.settings") import django django.setup() from app01.models import * # 基於雙 下劃線的一對多查詢 # 查詢出版社為北京出版社出版的所有圖書的名字,價格 # ret=Publish.objects.filter(name='北京出版社').values('book__name','book__price')# print(ret) # ret=Book.objects.filter(publish__name='北京出版社').values('name','price') # print(ret) # 查詢北京出版社出版的價格大於19的書 # ret=Publish.objects.filter(name='北京出版社',book__price__gt=19).values('book__name','book__price') # print(ret) # 多對多 # 查詢紅樓夢的所有作者名字 # ret=Book.objects.filter(name='紅樓夢').values('authors__name')# print(ret) # ret=Author.objects.filter(book__name='紅樓夢').values('name') # print(ret) # 查詢圖書價格大於30的所有作者名字 # ret=Book.objects.filter(price__gt=30).values('authors__name') # print(ret) # 進階練習--連續跨表 # 查詢北京出版社出版過的所有書籍的名字以及作者的姓名 # ret=Publish.objects.filter(name='北京出版社').values('book__name','book__authors__name') # print(ret) # ret=Book.objects.filter(publish__name='北京出版社').values('name','authors__name') # print(ret) # 手機號以151開頭的作者出版過的所有書籍名稱以及出版社名稱 # ret=AuthorDetail.objects.filter(phone__startswith='13').values('author__book__name','author__book__publish__name') # print(ret) # ret=Book.objects.filter(authors__authordetail__phone__startswith='13').values('name','publish__name') # # print(ret) # 聚合查詢aggregate from django.db.models import Avg,Count,Max,Min,Sum # 計算所有圖書的平均價格 # ret=Book.objects.all().aggregate(Avg('price')) # print(ret) # 計算圖書的最高價格 # ret=Book.objects.all().aggregate(Max('price')) # print(ret) #他是queryset的終止子句 # 計算圖書的最高價格,最低價格,平均價格,總價 # # ret=Book.objects.all().aggregate(Max('price'),Min('price'),Avg('price'),Sum('price')) # print(ret) #分組查詢annotate() # 統計每一本書作者個數 # ret=Book.objects.all().annotate(c=Count('authors')) # print(ret) # for r in ret: # print(r.name,'---->',r.c) # ret=Book.objects.all().annotate(c=Count('authors')).values('name','c') # print(ret) # 統計每一個出版社的最便宜的書(以誰group by 就以誰為基表) # ret=Publish.objects.all().annotate(m=Min('book__price')).values('name','m') # print(ret) # 統計每一本以py開頭的書籍的作者個數 # ret1=Book.objects.all().filter(name__startswith='py').annotate(c=Count('authors')).values('name','c') # print(ret1) # 總結: group by 誰,就以誰做基表,filter過濾,annotate取分組,values取值 # 總結終極版本 # values在前,表示group by 在後,表示取值 # filter在前,表示where條件,在後表示having # 統計每一本以py開頭的書籍的作者個數--套用模板 # ret2=Book.objects.all().values('name').filter(name__startswith='py').annotate(c=Count('authors')).values('name','c') # print(ret2) # 查詢各個作者出的書的總價格 # ret=Author.objects.all().values('name').annotate(s=Sum('book__price')).values('name','s') # ret=Author.objects.all().annotate(s=Sum('book__price')).values('name','s') # print(ret) #查詢名字叫lqz作者書的總價格 # ret=Author.objects.all().values('pk').filter(name='lqz').annotate(s=Sum('book__price')).values('name','s') # print(ret) # 查詢所有作者寫的書的總價格大於30 # ret=Author.objects.all().values('pk').annotate(s=Sum('book__price')).filter(s__gt=2).values('name','s') # ret=Author.objects.all().annotate(s=Sum('book__price')).filter(s__gt=30).values('name','s') # print(ret) # 總結終極版本 # values在前,表示group by 在後,表示取值 # filter在前,表示where條件,在後表示having # 統計不止一個作者的圖書 ret=Book.objects.all().values('pk').annotate(c=Count('authors')).filter(c__gt=1).values('name','c') # ret = Book.objects.annotate(author_num=Count("authors")).filter(author_num__gt=1).values('name','author_num') print(ret)