django中的聚合查询与原生的数据库操作方法

聚合查询

  • 聚合查询是指对一个数据表中的一个字段的数据进行部分或全部进行统计查询,查bookstore_book数据表中的全部书的平均价格,查询所有书的总个数等,都要使用聚合查询
  1. 不带分组聚合
    • 不带分组的聚合查询是指导将全部数据进行集中统计查询

    • 聚合函数:
      -定义模块: django.db.models
      -用法: from django.db.models import *
      -聚合函数:
      -Sum, Avg, Count, Max, Min

    • 语法:

      -MyModel.objects.aggregate(结果变量名=聚合函数(‘列’))

    • 返回结果:
      -由 结果变量名和值组成的字典
      -格式为:
      `{“结果变量名”: 值}
      示例:

      # 得到所有书的平均价格
      from bookstore import models
      from django.db.models import Count
      result = models.Book.objects.aggregate(myAvg=Avg('price'))
      print("平均价格是:", result['myAvg'])
      print("result=", result)  # {"myAvg": 58.2}
      
      # 得到数据表里有多少本书
      from django.db.models import Count
      result = models.Book.objects.aggregate(mycnt=Count('title'))
      print("数据记录总个数是:", result['mycnt'])
      
  2. 分组聚合
    • 分组聚合是指通过计算查询结果中每一个对象所关联的对象集合,从而得出总计值(也可以是平均值或总和),即为查询集的每一项生成聚合。

    • 语法:

      QuerySet.annotate(结果变量名=聚合函数(‘列’))

    • 用法步骤:

      1. 通过先用查询结果MyModel.objects.value. 查找查询要分组聚合的列
        -MyModel.objects.value(‘列1’, ‘列2’)

      2. 通过返回结果的 QuerySet.annotate 方法分组聚合得到分组结果
        -QuerySet.annotate(名=聚合函数(‘列’))
        -返回 QuerySet 结果集,内部存储结果的字典
        -如:

         pub_count_set = pub_set.annotate(myCount=Count('pub'))
         print(pub_count_set)  # <QuerySet [{'pub': '清华大学出版社', 'myCount': 7}, {'pub': '机械工业出版社', 'myCount': 3}]>
        
    • 示例:

      • 得到哪儿个出版社共出版多少本书
      def test_annotate(request):
         from django.db.models import Count
         from . import models
      
          # 得到所有出版社的查询集合QuerySet
          pub_set = models.Book.objects.values('pub')
          # 根据出版社查询分组,出版社和Count的分组聚合查询集合
          pub_count_set = pub_set.annotate(myCount=Count('pub'))  # 返回查询集合
          for item in pub_count_set:
              print("出版社:", item['pub'], "图书有:", item['myCount'])
          return HttpResponse('请查看服务器端控制台获取结果')
      

原生的数据库操作方法

在django中,可以使用模型管理器的raw方法来执行select语句进行数据查询(使用原生的sql语句在django中进行数据库查询)

  1. 语法:
    MyModel.objects.raw(sql语句)
  2. 用法
    MyModel.objects.raw(‘sql语句’)
  3. 返回值:QuerySet 集合对象
  4. 示例
books = models.Book.objects.raw('select * from bookstore_book')
for book in books:
	print(book)

猜你喜欢

转载自blog.csdn.net/qq_43435274/article/details/103261487