码迷,mamicode.com
首页 > 编程语言 > 详细

python-day71--django多表双下划线查询及分组聚合

时间:2017-10-30 21:21:22      阅读:249      评论:0      收藏:0      [点我收藏+]

标签:定义   显示   ted   手机号   组成   filter   with   values   python   

#====================================双下划线的跨表查询===============
# 前提 此时 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多表双下划线查询及分组聚合

标签:定义   显示   ted   手机号   组成   filter   with   values   python   

原文地址:http://www.cnblogs.com/liuwei0824/p/7756295.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!