【发布时间】:2025-12-16 13:15:01
【问题描述】:
我有两个具有一对多关系的模型。 一个名为 repairorder 的模型,可以有一个或多个按该订单执行的工作实例。
我需要对 Repairorder 查询集进行注释以求和累计工作持续时间。在 Work 模型上,我根据开始和结束日期时间戳注释了单个 Work 实例的持续时间。现在我需要使用这个带注释的字段来汇总为每个订单执行的总累积工作量。我尝试扩展基本模型管理器:
from django.db import models
class WorkManager(models.Manager):
def get_queryset(self):
return super(OrderholdManager, self).get_queryset().annotate(duration=ExpressionWrapper(Coalesce(F('enddate'), Now()) - F('startdate'), output_field=DurationField()))
class Work(models.Model):
#...
order_idorder = models.ForeignKey('Repairorder', models.DO_NOTHING)
startdate = models.DateTimeField()
enddate = models.DateTimeField()
objects = WorkManager()
class RepairorderManager(models.Manager):
def get_queryset(self):
return super(RepairorderexternalManager, self).get_queryset().annotate(totalwork=Sum('work__duration'), output_field=DurationField())
class Repairorder(models.Model):
#...
idrepairorder = models.autofield(primary_key=True)
objects = RepairorderManager()
对于每个 Repairorder,我想显示“总工作量”,但是会出现此错误:QuerySet.annotate() received non-expression(s): 。如果我从 RepairorderManager 中删除 output_field=DurationField(),它会显示:Cannot resolve keyword 'duration' into field。
使用模型属性以“Python 方式”进行操作不是大型数据集的选择。
【问题讨论】:
标签: django annotations