2009-12-09 13 views
7

Je dois obtenir la valeur agrégée de deux colonnes. Alors d'abord les multiplier ensemble puis obtenir le leur sum(). Le code ci-dessous ne fonctionne naturellement pas, c'est juste pour la clarification.Django: obtient la valeur agrégée de deux colonnes multipièces

Est-ce que c'est en quelque sorte possible ou devrais-je utiliser le SQL brut?

SomeModel.objects 
    .filter(**something) 
    .aggregate(Sum('one_column' * 'another_col')) 

Répondre

10

Vous n'avez pas besoin de beaucoup de SQL brut en utilisant extra().

obj = SomeModel.objects.filter(**something).extra(
    select = {'total': 'SUM(one_column * another_column)'}, 
) 
1

Ceci est sparta. De cette façon, si vous voulez imprimer quelque part dans un modèle que vous devez utiliser quelque chose comme ceci:

{{ queryset.0.total }} 

Cela a été répondu correctement ici: Django Aggregation: Summation of Multiplication of two fields

La forme est:

agg = Task.objects.all().aggregate(total=Sum('field1', field="field1*field2")) 
1

Comme j'ai répondu ici https://stackoverflow.com/a/36024089/4614802 la bonne solution dépend de la version django.

  • Pour django < 1,8 utilisation .aggregate(Sum('field1', field="field1*field2"))
  • Pour django> = 1,8 utilisation .aggregate(Sum(F('field1')*F('field2'))