Django - 显示模板上模型的字段的过滤总和

时间:2013-08-15 12:15:15

标签: python django django-models django-templates django-views

我有一个与(quantidadeEvento)有一对多关系的模型(camisaEvento)。我想在模板上显示quantdadeEvento中字段的总和,但仅针对camisaEvento上的确定记录的元素。

在视图上我有以下内容,它们被传递给模板到render_to_response:

camisasEvento = camisaEvento.objects.all()
quantidadesEvento = quantidadeEvento.objects.all()

我为camisaEvento的每个记录制作一个表格,最后我希望它有一个单元格,它是quantdadeEvento上确定字段的总和,但仅适用于for循环中的当前camisaEvento记录,所以在模板中我有以下内容:

{% for camisa_do_evento in camisasEvento %}
<table>
    <td>...<td>
    <td>...<td>
    .
    .
    .
    <td>The sum should be in here</td>
<table>
{% endfor %}

最好的方法是什么?我知道这可能很简单,但我对编程和Django都很陌生。

由于

2 个答案:

答案 0 :(得分:3)

您应该使用aggregation framework来计算视图中的总和:

from django.db.models import Sum
camisasEvento = camisaEvento.objects.all().annotate(quantidade_sum=Sum('quantidadeevento__field_to_sum')

其中'field_to_sum'是您要添加的字段。这会在每个quantidade_sum上创建一个名为camisasEvento的属性,该属性包含相关字段的总和。

请注意,在模板中,您可以使用反向关系遍历与每个camisaEvento相关的quantdadeEvento对象:

<table>
    {% for camisa_do_evento in camisasEvento %}
    <tr>
        {% for quantidade_evento in camisa_do_evento.quantidadeEvento.all %}
          <td>{{ quantidade_evento.my_field }}<td>
        {% endfor }
        <td>Sum: {{ camisa_do_evento.quantidade_sum }}</td>
    </tr>
    {% endfor %}
<table>

答案 1 :(得分:1)

为什么不在camisaEvento上使用属性?

class camisaEvento(models.Model):

    ...

    @property
    def sum_quantity(self):
        # just guessing, don't know exactly what you need
        # it's using python's list comprehension, but you can use a more explicit
        # syntax if you're not familiar with this one
        return sum([obj.field_to_sum for obj in               
                    quantidadeEvento.objects.filter(fk_field=self.id)])

然后,在您的模板中:

{% for camisa_do_evento in camisasEvento %}
    {{ camisa_do_evento.sum_quantity }}
{% endfor %}

这是如何工作的:我正在camisaEvento类创建一个方法来获取该类的所有quantidadeEvento并总结他们的字段(这是“幻想”逻辑,因为我不知道确切地知道你需要总和的东西)。然后,在您的模板中,您只需调用该方法,就好像它是您的camisaEvento类的真实属性