经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Django » 查看文章
django 中的聚合函数,分组函数,F 查询,Q查询
来源:jb51  时间:2019/7/25 11:01:04  对本文有异议

先以mysql的语句,聚合用在分组里,

对mysql中groupby 是分组

每什么的时候就要分组,如 每个小组,就按小组分,

group by 字段 having 聚合函数

#举例 :求班里的平均成绩, select Avg(score) from stu

在django中

聚合 是aggreate(*args,**kwargs),通过QuerySet 进行计算。做求值运算的时候使用

分组 是annotate(*args,**kwargs),括号里是条件,遇到 每什么的时候就要分组,

先从models 导入要用到的函数

  1. from django.db.models import Min,Avg,Max,Sum
  2.  
  3. def aggregate(request):
  4.  
  5. #求所有书籍的平均价格
  6. ret11 = Book.objects.all().aggregate(Avg("price"))
  7. # print(ret11)#{'price__avg': 51.975}
  8.  
  9. #求所有书籍的最高价
  10. ret12 = Book.objects.all().aggregate(MaxPrice=Max('price'))
  11. # print(ret12)#{'MaxPrice': Decimal('100.00')}
  12.  
  13. #egon 出版过书籍的最高价格
  14. p = Book.objects.filter(authors__name='egon').aggregate(Max('price'))
  15.  
  16. print(p)#{'price__max': Decimal('100.00')}
  17.  
  18.  
  19.  
  20. #分组 annotate()
  21. #每一个作者出版过的书的最高价 ,
  22. #解析,按照作者的名字分组,就要用到values,显示的是字段的名字,
  23.  
  24. b1 = Book.objects.values('authors__name').annotate(Max('price'))
  25.  
  26. print(b1)
  27. #<QuerySet [{'authors__name': 'egon', 'price__max': Decimal('100.00')},
  28. # {'authors__name': 'alex', 'price__max': Decimal('100.00')},
  29. # {'authors__name': 'yuan', 'price__max': Decimal('100.00')},
  30. # {'authors__name': 'oldboy', 'price__max': Decimal('100.00')}]># 四个作者都关联了同一本书,而这本书又是最高价
  31. #每个出版社出版的最低价格的书籍
  32.  
  33. b2 = Book.objects.values('publish__name').annotate(Min('price'))
  34. print(b2)
  35. #<QuerySet [{'publish__name': '北京出版社', 'price__min': Decimal('100.00')},
  36. # {'publish__name': '河下出版社', 'price__min': Decimal('45.00')},
  37. # {'publish__name': '清华出版社', 'price__min': Decimal('39.90')},
  38. # {'publish__name': '人民出版社', 'price__min': Decimal('23.00')}]>

F Q 查询

F,主要是做查询

Q查询 可以做组合条件的查询 & 是 与 ,|(管道符) 或,~ 非

  1. def FAndQ(request):
  2. #给每本书涨价10元,
  3. #用sql语句写 update book set price=price+10
  4. #F,主要是做查询
  5. # Book.objects.all().update(price=F('price')+10)
  6. #查询书籍是富开头,并且价格大于30的书籍 ,逗号 可以做 与 的关系查询
  7. b4 = Book.objects.filter(title__startswith="富",price__gt=30)
  8. # print(b4)#<QuerySet [<Book: 富爸爸>]>
  9. #Q查询 可以做组合条件的查询 & 是 与 ,|(管道符) 或,~ 非
  10. ##查询书籍是富开头,或价格大于30的书籍
  11. b5 = Book.objects.filter(Q(title__startswith="富") | Q(price__gt=60))
  12. # print(b5)
  13. #<QuerySet [<Book: Linux>, <Book: 项塔兰>, <Book: 追风筝的人>, <Book: 富爸爸>]>
  14. #组合查询,以富开头,价格大于60 ,或者id大于5的书籍
  15. b6 = Book.objects.filter(Q(title__startswith="富")&Q(price__gt=60)|Q(id__gt=5))
  16. #print(b6)#<QuerySet [<Book: 富儿子>]>
  17. #
  18. #查询条件如果不加Q,就要放到最后面,
  19. b7 = Book.objects.filter(Q(price__gt=60) | Q(id__gt=5),title__startswith="富")
  20. # print(b7)
  21. # ~ 取反的意思
  22. b8 = Book.objects.filter(Q(title__startswith="富") & ~Q(price__gt=60) | Q(id__gt=5))
  23. print(b8)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号