1. 程式人生 > >多表操作,常用非常用欄位

多表操作,常用非常用欄位

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)