python-day71--django多表双下划线查询及分组聚合
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python-day71--django多表双下划线查询及分组聚合相关的知识,希望对你有一定的参考价值。
#====================================双下划线的跨表查询===============
# 前提 此时 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多表双下划线查询及分组聚合的主要内容,如果未能解决你的问题,请参考以下文章