【问题标题】:Django - Display filtered sum of a field from a model on templateDjango - 显示模板上模型中字段的过滤总和
【发布时间】:2013-08-17 15:02:35
【问题描述】:

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

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

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

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

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

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

谢谢

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    <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>
    

    【讨论】:

      【解决方案2】:

      为什么不在 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 类的真实属性

      【讨论】:

        猜你喜欢
        • 2018-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-24
        • 2021-02-10
        • 1970-01-01
        • 2017-06-09
        相关资源
        最近更新 更多