Есть ли в 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 различных запросов фильтрации на основе комбинаций типа и даты, но есть ли лучший способ решить эту проблему?

Вернуться на верх