Как добавить сумму аннотации к столбцу исходной модели - PullRequest
0 голосов
/ 04 августа 2020

Пример модели:

class Cluster(models.Model):
    index = models.BigIntegerField(blank=True, null=True)
    cluster_id = models.BigIntegerField(blank=True, null=True)
    module_count = models.BigIntegerField(blank=True, null=True)

Я знаю, что могу получить групповую сумму модели django с помощью:

    cluster_id | module_count 
    -------------------------
    1          | 1
    1          | 2
    2          | 3
    2          | 1
 

    sum_mods = clusters.values('cluster_id').annotate(data_sum=Sum('module_count'))


    cluster_id | module_count 
    -------------------------
    1          | 3
    2          | 4

Это даст мне сумму каждой группы сгруппированы по cluster_id.

Как я могу отнести эту сумму к столбцу в исходной модели? Например:

    cluster_id | module_count | data_sum 
    ----------------------------------------
    1          | 1            |3
    1          | 2            |3
    2          | 3            |4
    2          | 1            |4

Ответы [ 2 ]

0 голосов
/ 04 августа 2020
pk_list = list(set(Cluster.objects.all().values_list('cluster_id', flat=True)))
#return list of all unique cluster_id

for pk in pk_list:
    #get all cluster with this id
    lst = Cluster.objects.filter(cluster_id=pk)

    #get sum of all module_count
    sum_col = lst.aggregate(sum_col=Sum('module_count'))['sum_col']

    #update  all cluster with sum_col
    lst.update(module_count=sum_col)
0 голосов
/ 04 августа 2020

Попробуйте это

clusters.values('cluster_id').update(data_sum=Sum('module_count'))
...