Django ORM聚合查询和分组查询实现详解

  

models.py:

        django。数据库导入模型   #出版社   类的出版商(models.Model):   id=models.AutoField (primary_key=True)   name=模型。CharField (max_length=64,零=False,独特的=True)      def __str__(自我):   返回“& lt;出版商对象:{}在“.format (self.name)      #书籍   类的书(models.Model):   id=models.AutoField (primary_key=True)   title=模型。CharField (max_length=64,零=False,独特的=True)   价格=模型。DecimalField (max_digits=5, decimal_places=2,默认=00.00)#最长位数为5,小数位数为2,默认值为00.00   出版商=模型。ForeignKey(=胺⑿腥恕?null=True) #把空设置为真实的      def __str__(自我):   返回“& lt;书对象:{}在“.format (self.title)      #作者   类作者(models.Model):   id=models.AutoField (primary_key=True)   name=模型。null=False CharField (max_length=16日,独特的=True)   书=models.ManyToManyField(=笆椤?#多对多关联书表,ORM会自动生成第3张表      def __str__(自我):   返回“& lt;作者对象:{}在“.format (self.name)      

书表:   

 Django ORM聚合查询和分组查询实现详解

  

修改价格   

 Django ORM聚合查询和分组查询实现详解

  

<强>聚合查询:
  

  

总():返回一个包含一些键值对的字典。

  

键的名称是聚合值的标识符,值是计算出来的聚合值。键的名称是按照字段和聚合函数的名称自动生成出来的。

  

orm.py:

        进口操作系统   if __name__==癬_main__”:   #加载Django项目的配置信息   os.environ。setdefault (“DJANGO_SETTINGS_MODULE”、“mysite2.settings”)   #导入Django,并启动Django项目   进口django   django.setup ()   从app01导入模型   #聚合查询需要导入的函数   从django.db。模型导入Avg、总和、最大值、最小值、计数   #计算所有书籍价格的平均值   avg_ret=models.Book.objects.all () .aggregate (Avg(“价格”))   打印(avg_ret)   #计算所有书籍价格的总和   sum_ret=models.Book.objects.all () .aggregate (Sum(“价格”))   打印(sum_ret)   #计算所有书籍价格的最大值   max_ret=models.Book.objects.all () .aggregate (Max(“价格”))   打印(max_ret)   #计算所有书籍价格的最小值   min_ret=models.Book.objects.all () .aggregate (Min(“价格”))   打印(min_ret)   #计算所有书籍的价格个数   count_ret=models.Book.objects.all () .aggregate (Count(“价格”))   打印(count_ret)      

运行结果:

  

 Django ORM聚合查询和分组查询实现详解

  

生成的是字典类型

  

<>强分组:
  

  

orm.py:

        进口操作系统   if __name__==癬_main__”:   #加载Django项目的配置信息   os.environ。setdefault (“DJANGO_SETTINGS_MODULE”、“mysite2.settings”)   #导入Django,并启动Django项目   进口django   django.setup ()   从app01导入模型   从django.db。模型导入数   #查询每一本书的作者个数   ret=models.Book.objects.all () .annotate (author_num=Count(“作者”))#返回的是书对象,注释(author_num)相当于让书对象多了一个author_num字段   打印(ret)   受潮湿腐烂的书:   打印(“书名:{},作者数:{}“.format(书。标题、book.author_num)      

运行结果:

  

 Django ORM聚合查询和分组查询实现详解

  

这里的book.annotate (author_num)相当于让书对象多了一个author_num字段,但并不是在数据库中多了一个字段

  

orm.py:

        进口操作系统   if __name__==癬_main__”:   #加载Django项目的配置信息   os.environ。setdefault (“DJANGO_SETTINGS_MODULE”、“mysite2.settings”)   #导入Django,并启动Django项目   进口django   django.setup ()   从app01导入模型   从django.db。模型导入数   #查询作者数大于1的书   ret=models.Book.objects.all () .annotate (author_num=Count(“作者”)).filter (author_num__gt=1)   打印(ret)

Django ORM聚合查询和分组查询实现详解