#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. Есть какое-либо решение проблемы? Я застрял с тем же…