Django: сумма аннотированного поля после группировки

#django #django-queryset

#django #django-набор запросов

Вопрос:

У меня есть следующие две модели:

 class ProductionSet(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    line = models.ForeignKey(Line, on_delete=models.CASCADE)

class ProductionSetEntry(models.Model):
    productionset = models.ForeignKey(
        ProductionSet, on_delete=models.CASCADE, related_name="set"
    )
    audited_at = models.DateTimeField(
        verbose_name=_("Audited at"), null=True, blank=True
    )
  

Чего я хочу добиться, так это результирующего набора, сгруппированного для каждой строки с двумя показателями: общее количество записей и количество для полностью проверенных наборов. Пример результата:

 <QuerySet [{'line': 1, 'sum_fully_audited': 0, 'total': 43}, {'line': 2, 'sum_fully_audited': 0, 'total': 51}, {'line': 3, 'sum_fully_audited': 2, 'total': 4}]>
  

Я могу добавить fully_audited к каждой строке перед группировкой по:

 ProductionSet.objects.annotate(
    audited=Count("set", filter=Q(set__audited_at__isnull=False)),
).annotate(
    fully_audited=Case(
        When(audited=Count("set"), then=1),
        default=0,
        output_field=IntegerField(),
    )
)
  

Следующий запрос:

 ProductionSet.objects.annotate(
    audited=Count("set", filter=Q(set__audited_at__isnull=False)),
).annotate(
    fully_audited=Case(
        When(audited=Count("set"), then=1),
        default=0,
        output_field=IntegerField(),
    )
).values(
    "line", "fully_audited"
).annotate(
    total=Count("id", distinct=True),
    sum_fully_audited=Sum("fully_audited"),
).order_by(
    "line"
)
  

возникает django.core.exceptions.FieldError: Cannot compute Sum('fully_audited'): 'fully_audited' is an aggregate при

 ProductionSet.objects.annotate(
    audited=Count("set", filter=Q(set__audited_at__isnull=False)),
).annotate(
    fully_audited=Case(
        When(audited=Count("set"), then=1),
        default=0,
        output_field=IntegerField(),
    )
).values(
    "line", "fully_audited"
).annotate(
    total=Count("id", distinct=True),
).order_by(
    "line"
)
  

результаты, <QuerySet [{'line': 1, 'fully_audited': 0, 'total': 43}, {'line': 3, 'fully_audi... которые пока выглядят хорошо, но, очевидно, пока не имеют sum_fully_audited.

Комментарии:

1. Удалите fully_audited из `значений (..)» в третьем фрагменте кода. Не имеет никакого смысла использовать его как значение и агрегировать по нему.

2. Извините, это был остаток. Бит по-прежнему приводит к django.core.exceptions.FieldError: Cannot compute Sum('fully_audited'): 'fully_audited' is an aggregate

3. Есть какое-либо решение проблемы? Я застрял с тем же…