欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 培训 > django之 annotate,aggrate

django之 annotate,aggrate

2024/10/24 23:15:05 来源:https://blog.csdn.net/qq_41124528/article/details/140418007  浏览:    关键词:django之 annotate,aggrate

annotate:annotate() 不是一个终止子句。 annotate() 子句的输出是一个 QuerySet;这个 QuerySet 可以使用任何其他 QuerySet 操作进行修改,包括 filter()order_by(),甚至对 annotate() 的额外调用。"增加一列属性"

aggregate:aggregate() 是 QuerySet 的一个终止子句,当调用时,它返回一个名称-值对的字典。名称是聚合值的标识符;值是计算的聚合。名称会根据字段名称和聚合函数自动生成。如果你想手动指定聚合值的名称,你可以在指定聚合子句时提供该名称。"返回统计字典"

1、表结构

class Singler(models.Model):""" 歌手表模型 """name = models.CharField(max_length=50)first_letter = models.CharField(max_length=15, editable=False)height = models.IntegerField(default=0, blank=True)weight = models.IntegerField(default=0, blank=True)constellation = models.CharField(max_length=50)english_name = models.CharField(max_length=50, default='-')gender = models.IntegerField(choices=((0, '女'), (1, '男')), default=1)country_name = models.CharField(max_length=50, default='-')desc = models.TextField()def __str__(self):return self.nameclass Singe(models.Model):""" 单曲表 """name = models.CharField(max_length=50)duration = models.IntegerField(editable=False, default=0)playnum = models.IntegerField(default=0, editable=False)# 设置与歌手表关联外键 一对多外键设置在多的模型中singler = models.ForeignKey("Singler", on_delete=models.CASCADE)def __str__(self):return self.name

2、annotate

2.1 annotate使用

    def get(self, request):result = Singler.objects.annotate(singe_count=Count('singe'))for i in result:print(i, type(i))print(i.singe_count)return Response({'msg': 'ok', 'code': 200})

以上操作可以理解为,为singler表增加了一列,列名是singe_count,并且如果想要获取一列的数据,需要使用.singe_count的方式,如果担心有重复值,可以添加一个distinct的参数

singe_count=Count('singe', distinct=True)
SELECT `singe_singler`.`id`, `singe_singler`.`name`, `singe_singler`.`first_letter`, `singe_singler`.`height`, `singe_singler`.`weight`,`singe_singler`.`constellation`, `singe_singler`.`english_name`, `singe_singler`.`gender`, `singe_singler`.`country_name`, `singe_singler`.`des
c`, COUNT(`singe_singe`.`id`) AS `singe_count` FROM `singe_singler` LEFT OUTER JOIN `singe_singe` ON (`singe_singler`.`id` = `singe_singe`.`singler_id`) GROUP BY `singe_singler`.`id` ORDER BY NULL; args=(); alias=default

2.2 value和annotate结合使用

class IndexAPIView(APIView):def get(self, request):result = Singler.objects.values('name').annotate(singe_count=Count('singe'))for i in result:print(i, type(i))print(i['singe_count'])return Response({'msg': 'ok', 'code': 200})

以上可以理解为在Singler表上增加了一列,列名为singe_count

在前面使用了一个values,这个方法本身是用来指定要展示的字段(返回一个字典),但是放在annotate前面,两者结合就变成了 根据values中的属性分组计算每个name的singe_count.

实际执行的SQL语句如下:

SELECT `singe_singler`.`name`, COUNT(`singe_singe`.`id`) AS `singe_count` FROM `singe_singler` LEFT OUTER JOIN `singe_singe` ON (`singe_singler`.`id` = `singe_singe`.`singler_id`) GROUP BY `singe_singler`.`name` ORDER BY NULL; args=(); alias=default

3、aggregate

class AggregateAPIView(APIView):def get(self, request):result = Singe.objects.aggregate(s_num=Count('name'),p_sum = Sum('playnum'))print(result)return Response({'msg': 'ok', 'code': 200})

以上操作:进行聚合查询,返回一个字典结果,并且在aggregate的时候可以自己定义key名

实际执行的SQL如下:

SELECT COUNT(`singe_singe`.`name`) AS `s_num`, SUM(`singe_singe`.`playnum`) AS `p_sum` FROM `singe_singe`; args=(); alias=default

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com