Джанго: Как показать сумму поля модели в шаблоне - PullRequest
0 голосов
/ 23 февраля 2019

Я построил следующую модель:

class Fund(models.Model):
    name = models.CharField(max_length=30)
    gp = models.ForeignKey(GeneralPartner, on_delete = models.CASCADE)
    currency = models.CharField(max_length=3, default="")
    commitment = models.IntegerField(default=0)


    def __str__(self):
        return self.name

    @property
    def sum_commitment(self):
        return self.commitment

Я хотел бы показать сумму всех обязательств в моем шаблоне с помощью простого тега {{ fund.sum_commitment }} в моем шаблоне.Как должно выглядеть мое обратное заявление для достижения этой цели?Я пробовал что-то вроде return self.sum(commitment) во всех вариантах, но просто не могу найти правильное решение.

Большое спасибо за любую помощь!

1 Ответ

0 голосов
/ 23 февраля 2019

Я думаю, что вы можете сделать это следующим образом, используя Aggregate :

from django.db.models import Sum

@property
def sum_commitment(self):
    return self.__class__.objects.all().aggregate(sum_all=Sum('commitment')).get('sum_all')

Обновление

из комментариев. Я предполагаю, что вы используете ListView, тогда вы можетепросто добавьте еще одну переменную к get_context_data, чтобы добавить сумму обязательств.Например:

class SomeListView(ListView):
    ...


    def get_context_data(self, **kwargs):
        context = super(SomeListView, self).get_context_data(**kwargs)
        context['commitment_sum'] = Fund.objects.all().aggregate(sum_all=Sum('commitment')).get('sum_all')
        return context

Затем получите доступ к значению в шаблоне с помощью {{ commitment_sum }}.

Кроме того, существует возможность, что вам нужно повторно использовать этот код несколько раз, тогда вы можете использовать метод класса , вместо метода свойства, подобного следующему:

@classmethod
def sum_commitment(cls):
    return cls.objects.all().aggregate(sum_all=Sum('commitment')).get('sum_all')

И использовать его в представлении так:

context['commitment_sum'] = Fund.sum_commitment()
...