Django-model聚合查询与分组查询

  1. 聚合函数包含:SUM AVG MIN MAX COUNT
  2. 聚合函数可以单独使用,不一定要和分组配合使用;不过聚合函数一般和group by 搭配使用
  3. aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典。
  4. 分组查询 annotate 查询出来的结果任然是集合是QuerySet类型;
  5. annotate对获取的集合进行分组,按照集合的个数分组;

聚合查询的使用aggregate()来调用

1.查询所有书籍的总价格

from django.db.models import Avg,Count,Min,Max,Sum
def juheQuery(request):
# 统计所有书籍的总价格 aggregate 用来调用聚合函数的
# 可以通过binming= 来定义别名为 binming
book_list=models.Book.objects.all().aggregate(binming=Sum("price"))
print(book_list)
return HttpResponse("OK")

输出:

{'binming': Decimal('5144.00')}

2.查询出所有书籍的平均价格

from django.db.models import Avg,Count,Min,Max,Sum
def juheQuery(request):
book_list=models.Book.objects.all().aggregate(AVG_binming=Avg("price"))
print(book_list)
return HttpResponse("OK")

输出:

{'AVG_binming': 16.12539184952978}

3.同时查询出,这些书籍的平均值,最大值,和最小值

from django.db.models import Avg,Count,Min,Max,Sum
def juheQuery(request):
book_list=models.Book.objects.all().aggregate(Avg("price"),Max("price"),Min("price"))
print(book_list)
return HttpResponse("OK")

输出:

{'price__max': Decimal('111.00'), 'price__min': Decimal('11.00'), 'price__avg': 16.12539184952978}

分组查询 annotate()来调用

1.统计书本有作者的记录,并求出该书有 几个作者

from django.db.models import Avg,Count,Min,Max,Sum
def juheQuery(request):
book_obj=models.Book.objects.filter(authors__age__gt=0).annotate(c=Count("authors"))
print(book_obj.values_list("title","c")) return HttpResponse("OK")

输出:

<QuerySet [('三国演义', 3), ('红楼梦1', 1), ('李四的歌', 1), ('ccc', 3)]>

2.统计每个出版社,出版书籍价格的总和

from django.db.models import Avg,Count,Min,Max,Sum
def juheQuery(request):
book_obj=models.Publish.objects.all().annotate(c=Sum("book__price"))
print(book_obj.values_list("name","c"))
return HttpResponse("OK")

输出:

<QuerySet [('小黄人出版社', Decimal('595.00')), ('小红帽出版社', Decimal('4428.00')), ('红太阳出版社', Decimal('121.00'))]>

3.统计每个出版社,出版过的书籍数量

from django.db.models import Avg,Count,Min,Max,Sum
def juheQuery(request):
book_obj=models.Publish.objects.all().annotate(c=Count("book__title"))
print(book_obj.values_list("name","c"))
return HttpResponse("OK")

输出:

<QuerySet [('小黄人出版社', 30), ('小红帽出版社', 284), ('红太阳出版社', 5)]>

4.通过Book表查出每个出版社出版过书籍的本数;

from django.db.models import Avg,Count,Min,Max,Sum
def juheQuery(request):
# 先获取所有的书本集合set,根据集合取出出版社对象几个;按照出版社集合分组,计数出版社出版的书籍数量
book_obj=models.Book.objects.all().values_list("publisher__name").annotate(c=Count("title"))
# 取出出版数量c ,以及出版社的名称
print(book_obj.values_list("c","publisher__name"))
return HttpResponse("OK")

5.统计出书名以"三"开头的书籍,作者的个数;

from django.db.models import Avg,Count,Min,Max,Sum
def juheQuery(request):
book_obj=models.Book.objects.filter(title__startswith="三", authors__age__gt=0).annotate(c=Count("authors"))
print(book_obj.values_list("c","title"))
return HttpResponse("OK")

输出:

<QuerySet [(3, '三国演义'), (2, '三毛流浪记')]>

6.统计作者个数大于一个人的书籍

from django.db.models import Avg,Count,Min,Max,Sum
def juheQuery(request):
book_obj=models.Book.objects.all().annotate(c=Count("authors")).filter(c__gt=1)
print(book_obj.values_list("c","title"))
return HttpResponse("OK")

输出:

<QuerySet [(3, '三国演义'), (3, 'ccc'), (2, '三毛流浪记')]>

F查询与Q查询

  1. F()的实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段的值。
  2. F()也可以用来做直接的运算;

F查询(可以获取某个字段值):

1.查询出,评论数大于阅读数的书籍

from django.db.models import F,Q
def FQQuery(request):
book_obj=models.Book.objects.filter(comment_num__gt=F("read_num"))
print(book_obj.values_list("title"))
return HttpResponse("OK")

输出:

<QuerySet [('小兵张嘎',), ('人鱼传说',), ('小红书',), ('小红书',), ('小红书',), ('三国演义',)]>

2.查询出,评论数是阅读数2倍的书籍;

from django.db.models import F,Q
def FQQuery(request):
book_obj=models.Book.objects.filter(comment_num__gt=F("read_num")*2)
print(book_obj.values_list("title"))
return HttpResponse("OK")

输出:

<QuerySet [('人鱼传说',), ('小红书',), ('小红书',), ('小红书',), ('三国演义',)]>

3.将所有的书籍价格+10

from django.db.models import F,Q
def FQQuery(request):
models.Book.objects.all().update(price=F("price")+10) return HttpResponse("OK")

Q 查询:使用(|或 &且)

1.评论数大于100或阅读数大于100的书本---|

from django.db.models import F,Q
def FQQuery(request):
book_obj=models.Book.objects.filter(Q(comment_num__gt=100)|Q(read_num__gt=100))
print(book_obj.values_list("title"))
return HttpResponse("OK")

输出:

<QuerySet [('人鱼传说',), ('三国演义',)]>

ORM修改和ORM删除

1.ORM修改

   1 obj.name="egon"  obj.save()  效率低
2 表.objects.all().update(name="") 推荐 注意点:update方法是QuerySet数据类型的方法。model对象不能调用。

2.ORM删除

   表.objects.filter().delete()

   注意事项:
1 、 delete()是QuerySet数据类型的方法
2 、 级联删除

最新文章

  1. linux下拷贝命令中的文件过滤操作记录
  2. JScrollBar
  3. 【转】jquery.cookie.js的使用
  4. HTML5 web Form表单验证实例
  5. [BZOJ1067][SCOI2007]降雨量
  6. Ubuntu 14.04 安装 VirtualBox
  7. part 5 Two way databinding in AngularJS
  8. 奔五的人,准备学习iOS开发
  9. c++ primer 函数传值1
  10. Redis监控数据分布工具Redis-audit 使用总结
  11. 去除IOS浏览器下面的工具栏
  12. Leetcode题解(三)
  13. NoSQL:redis缓存数据库
  14. 部分手机浏览器存在将ajax请求当成广告过滤的情况,及解决方案
  15. ActiveMQ的Destination高级特性
  16. 在Linux系统使用VMware安装虚拟机
  17. 解决git push时发现有超过100M的文件时,删除文件后,发现还是提交不上去的问题
  18. 防火墙禁ping:虚拟机ping不通主机,但主机可以ping虚拟机
  19. 服务器返回:type&quot;:&quot;Buffer&quot;,&quot;data&quot;:
  20. http协议解析过程

热门文章

  1. 将replicated数据与元数据关联
  2. debian 9 安装 teamviewer 13
  3. 【转】Vim速查表-帮你提高N倍效率
  4. eMMC基础技术1:MMC简介
  5. 题解-CodeForces700E Cool Slogans
  6. P3830 [SHOI2012]随机树 题解
  7. mysqlfrm初步使用
  8. Light OJ 1007
  9. Appium+Java(三)搭建环境之踩过的坑
  10. css中input框不可点击+首行缩进