首页 > 解决方案 > 我该如何划分这些字段并聚合

问题描述

class Worker(models.Model):
    name = models.CharField(max_length=180, blank=True, null=True)

    def __str__(self):
        return str(self.name)


class WorkDone(models.Model):
    worker = models.ManyToManyField(Worker, related_name='workers')
    work_title = models.CharField(max_length=180, blank=True, null=True)
    units = models.IntegerField(blank=True, null=True)


    def __str__(self):
        return str(self.work_title)

意见

  context['work_done_by_single_person'] = Worker.objects.all() \
            .values('name', 'workers__work_title')\
            .order_by('name') \
            .annotate(total_work=(
        Sum('workers__units')/Count('name'))
        )
  print(context['workers'])   

打印输出

<QuerySet [{'name': 'dinesh', 'workers__work_title': 'first', 'total_work': 4}, {'name': 'ramesh', 'workers__work_title': 'first', 'total_work': 4}]>

而不是 4 它应该是 2,因为总单位是 4 而不是。工人是 2

标签: django

解决方案


如果我没记错的话,您将无法执行此操作,因为您无法对聚合执行算术运算。您必须在一个单独的聚合变量中进行计数,然后在您的注释中,在那里进行数学运算。

目前,Django 不允许在注释中执行子查询。

total_worker__units = Worker.objects.values('workers__work_title').count()
context['workers'] = Worker.objects.all() \
            .values('name', 'workers__work_title')\
            .order_by('name') \
            .annotate(total_work=(
        total/Count('name'))
        )

详见https://code.djangoproject.com/ticket/28296 _


推荐阅读