django - 我该如何划分这些字段并聚合
问题描述
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 不允许在注释中执行子查询。
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'))
)
推荐阅读
- python - PyAv av.open() 指定使用的编解码器
- javascript - 如何使我的前缀适用于小写和大写?
- javascript - 为什么我无法获得在 Vue JS 中使用 v-for 的基本示例?
- swift - 从 Firestore 获取用户配置文件的数据(swift、iOS、Xcode、firebase/firestore)
- python - 将一系列包含混合内容的CSV文件读入Python进行数据分析
- python - Scrapy Html 表到带有重复标题的 DataFrame
- php - 致命错误:无法在 php 中对表达式的结果使用 isset()(您可以改用“null !== expression”)
- powershell - Powershell不会将击键传递给cli窗口
- javascript - 从Javascript卡到HTML,一定有更好的方法(工作)
- java - 如何从一个 GUI 类中获取变量并传递给另一个?