1. 程式人生 > >python-day71--django多表雙下劃線查詢及分組聚合

python-day71--django多表雙下劃線查詢及分組聚合

cts 劃線 django del 就是 auth 分組聚合 with 沒有

#====================================雙下劃線的跨表查詢===============
# 前提 此時 related_name=bookList
屬性查詢: # 查詢linux這本書的出版社的地址? # linux_obj=models.Book.objects.filter(title="linux").first() # print(linux_obj.publish.name) # # # 查詢老男孩出版社出版過的所有書籍的名字與價格 # # pubObj=models.Publish.objects.filter(name="老男孩出版社").first()
# print(pubObj.bookList.all().values("title","price")) #此時 related_name=bookList 雙下劃線查詢 : .filter(過濾的條件) .values(要顯示的值)

  註意:如果在沒有定義 related_name 時,反向查詢時 直接用表名,不需要加 _set
# 查詢linux這本書的出版社的地址? --正向查詢 #ret=models.Book.objects.filter(title="linux").values("publish__addr")
# print(ret) #或                  --反向查詢 # ret=models.Publish.objects.filter(bookList__title="linux").values("addr") # print(ret) # 查詢老男孩出版社出版過的所有書籍的名字與價格 # ret1=models.Publish.objects.filter(name="老男孩出版社").values("bookList__title","bookList__price") # print(ret1)
# # ret2=models.Book.objects.filter(publish__name="老男孩出版社").values("title","price") # print(ret2) #查詢egon出過的所有書籍的名字(多對多) ret=models.Author.objects.filter(name="egon").values("bookList__title") print(ret) ret2=models.Book.objects.filter(authorlist__name="egon").values("title") print(ret2) # egon出版過的所有書籍名稱以及出版社名稱 ret=models.Book.objects.filter(authorlist__name=egon).values(title,Publish__name) # 手機號以151開頭的作者出版過的所有書籍名稱以及出版社名稱 # 方法1: # ad=models.AuthorDetail.objects.filter(tel__startswith="151").first() # print(ad.author.bookList.all().values("title","publish__name")) # 方法2 models.Book.objects.filter(authorlist__authordetail__tel__startswith="151").values("title","publish__name")

    #================================================================聚合函數


    from django.db.models import Avg,Sum,Count,Max,Min

    # 聚合函數:aggregate
# 查詢所有圖書的價格和 ret=models.Book.objects.all().aggregate(priceSum=Sum("price")) print(ret) # {‘priceSum‘: Decimal(‘166.00‘)} ret=models.Book.objects.all().aggregate(priceAvg=Avg("price"),priceSum=Sum("price")) # 分組函數 annotate函數 # 查詢每一本書的作者個數 book_list=models.Book.objects.all().annotate(c=Count("authorlist__name")) #此時的book_list 是一個QuerySet for book_obj in book_list: print(book_obj.c) #默認分組成一組, 分組後會在新表中新增一個 c 的字段 # 查詢每一個出版社出版過的最便宜的書籍 ret=models.Book.objects.all().values(publish__id).annotate(Min("price")) #values內的字段就是分組字段 print(ret)

python-day71--django多表雙下劃線查詢及分組聚合