Django中带模型管理器的注释

时间:2019-07-05 20:39:13

标签: django annotations

我有两个具有一对多关系的模型。 一种名为维修订单的模型,该模型可以具有对该订单执行的一个或多个工作实例。

我需要注释“修理订单”查询集以求和累计工作持续时间。在工作模型上,我根据开始和结束日期时间戳记注释了单个工作实例的持续时间。现在,我需要使用此带注释的字段来汇总每个订单执行的总累积工作。我试图扩展基础模型管理器:

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()

对于每个维修订单,我想显示“总计”,但是出现此错误:QuerySet.annotate()收到非表达式:。并且如果我从RepairorderMananager中删除了output_field = DurationField(),则会显示:无法将关键字“ duration”解析为字段。

使用模型属性以“ Python方式”执行此操作对于大型数据集是不可行的。

1 个答案:

答案 0 :(得分:0)

您还需要将计算结果添加到RepairorderManager

class RepairorderManager(models.Manager):
    def get_queryset(self):
        return super(RepairorderexternalManager, self).get_queryset().annotate(
            totalwork=ExpressionWrapper(
                Sum(Coalesce(F('work__enddate'), Now()) - F('work__startdate')),
                output_field=DurationField()
            )
        )

Django不会()考虑经理对相关对象引入的注释。