Django:如何在模板中显示“模型”字段的总和

时间:2019-02-23 20:42:56

标签: python django django-models

我建立了以下模型:

var l_headers = {
   Accept: 'application/json',
   'Content-Type': 'application/json'
};
var l_init = {
    method: "POST",
    headers: l_headers,
    body: {}
};
fetch("http://172.20.10.12:8000/test", l_init).then(function (response) {
    return response.json();
}).then(function (responseJson) {
    alert('API called: ' + JSON.stringify(responseJson));
});

我想通过模板中的简单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 标签显示模板中所有承诺的总和。为了实现这个目标,我的return语句看起来像什么?我尝试了各种{{ fund.sum_commitment }}之类的方法,但根本找不到合适的解决方案。

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我认为您可以使用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 }}访问模板中的值。

此外,您可能需要多次重用此代码,然后可以使用class method而不是像这样的属性方法:

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

并在这样的视图中使用它:

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