Есть ли в Django Queryset способ обновлять объекты по группам, которые формируются с помощью group_by(annotations)?
Мой конкретный пример:
class AggregatedResult(models.Model) :
amount = models.IntegerField()
class RawResult(models.Model) :
aggregate_result = models.ForeignKey(AggregatedResult, ...)
type = models.CharField()
date = models.DateField()
amount = models.IntegerField()
В этом конкретном примере RawResults
имеют разный тип и дату, и я хотел бы сделать кверисет для их объединения. поэтому, например, я бы сделал что-то вроде :
RawResults.objects.values("type","date").annotate(amount_sum = Sum("amount"))
Затем я бы создал AggregatedResult
объекты на основе результатов.
Проблема в том, что у меня есть отношение ForeignKey к AggregatedResult
и я хотел бы присвоить соответствующий внешний ключ к RawResult
, основываясь на том, какие объекты внесли вклад в какой результат.
Например, предположим:
RawResult
idx type date amount
1 A 10-04 10
2 A 10-04 8
3 A 10-05 7
4 B 10-04 5
выполнение приведенного выше набора запросов даст мне агрегированные значения, однако я хочу обновить объекты RawResult
, чтобы они были правильно сопоставлены с AggregatedResult
. Например:
[
{A, 10-04, 18} new AggregatedResult(1) <- RawResult 1,2 should have aggregate_result = 1
{A, 10-05, 7} new AggregatedResult(2) <- RawResult 3 should have aggregate_result = 2
{B, 10-04, 5} new AggregatedResult(3) <- RawResult 4 should have aggregate_result = 3
]
У меня умеренный размер RawResult (500k ish), и мало типов (~15 типов), и агрегированный результат, как ожидается, даст около ~5 различных дат, что дает мне около ~75 групп (и таким образом AggregatedResult
) всякий раз, когда я запускаю эту задачу.
Я понимаю, что могу полностью отказаться от group_by(values_annotate)
и запустить что-то вроде distinct
), а затем запустить ~75 различных запросов фильтрации на основе комбинаций типа и даты, но есть ли лучший способ решить эту проблему?