使用模型管理器在 django 中进行注释

Annotations in django with model managers

我有两个具有一对多关系的模型。 一个名为 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,我想显示 'totalwork',但是会出现此错误:QuerySet.annotate() received non-expression(s): 。如果我从 RepairorderMananager 中删除 output_field=DurationField(),它会显示:无法将关键字 'duration' 解析为字段。

使用模型属性'Python way' 对大数据集不可行。

您还需要将计算添加到 RepairorderManager

class RepairorderManager(models.Manager):
    def get_queryset(self):
        return super(RepairorderexternalManager, self).get_queryset().annotate(
            totalwork=ExpressionWrapper(
                <b>Sum(</b>Coalesce(F('<b>work__</b>enddate'), Now()) - F('<b>work__</b>startdate')<b>)</b>,
                output_field=DurationField()
            )
        )

Django 考虑管理器在相关对象上引入的注释。