首页 > 解决方案 > Django:如何在模板中显示模型字段的总和

问题描述

我已经建立了以下模型:

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),但根本找不到正确的解决方案。

非常感谢您的帮助!

标签: pythondjangodjango-models

解决方案


我认为您可以使用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()

推荐阅读