Аннотации в Django с модельными менеджерами - PullRequest
1 голос
/ 05 июля 2019

У меня есть две модели с отношением один ко многим.Одна модель с именем repairorder, которая может иметь один или несколько экземпляров работы, выполняемой для этого заказа.

Мне нужно аннотировать набор запросов Repairorder для суммирования совокупной продолжительности работы.В рабочей модели я аннотировал продолжительность одного экземпляра работы на основе отметок времени начала и окончания.Теперь мне нужно использовать это аннотированное поле для суммирования общей накопленной работы, выполненной для каждого заказа.Я попытался расширить диспетчер базовой модели:

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 () получил невыражение (я):.и если я удаляю output_field = DurationField () из RepairorderMananager, он говорит: Невозможно разрешить ключевое слово «duration» в поле.

Выполнение «пути Python» с использованием свойств модели не подходит для больших наборов данных.

1 Ответ

0 голосов
/ 05 июля 2019

Вам также необходимо добавить вычисление к 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()
            )
        )

Джанго не учитывает аннотации, введенные менеджером для связанных объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...