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.name


class 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

相关推荐

  1. Django缓存

    2024-07-15 08:40:01       54 阅读
  2. Django配置数据库

    2024-07-15 08:40:01       24 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-15 08:40:01       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-15 08:40:01       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-15 08:40:01       58 阅读
  4. Python语言-面向对象

    2024-07-15 08:40:01       69 阅读

热门阅读

  1. Linux shell自动交互之expect实践案例

    2024-07-15 08:40:01       22 阅读
  2. 代码改进,深度学习,强化学习

    2024-07-15 08:40:01       18 阅读
  3. Macos R安装xlsx ld: library not found for -lpcre2-8

    2024-07-15 08:40:01       20 阅读
  4. GitHub备份代码的学习笔记

    2024-07-15 08:40:01       24 阅读
  5. UF_add_callback_function

    2024-07-15 08:40:01       26 阅读
  6. 根服务器上市公司概览

    2024-07-15 08:40:01       24 阅读
  7. 【Go】如何使用 Go 连接 MySQL 数据库

    2024-07-15 08:40:01       20 阅读
  8. 职场新人感受

    2024-07-15 08:40:01       22 阅读