【问题标题】:Django aggregation in templates?模板中的 Django 聚合?
【发布时间】:2010-04-30 20:05:27
【问题描述】:

我正在思考Django aggregates. 的概念我不太“明白”它们在我的情况下如何使用。基本上我的模型中有一个三层的对象层次结构,最低的对象(Bar)包含我想要聚合的值。

class Bar(models.Model):
    amount = models.FloatField()

class Foo(models.Model):
    bars = models.ManyToManyField(Bar)

class MyUser(models.Model):
    foos = models.ManyToManyField(Foo)

我希望我的模板执行与此等效的操作:

{% for user in users %}
    <h2>{{ user }}</h2>
    <table>
        <tr>
            <td>Foo</td><
            <td>Average bar amount</td>
        </tr>
    {% for foo in user.foos.all %}
        <tr>
            <td>{{ foo }}</td>
            <td>{{ foo.bars.all.aggregate(Avg('amount')) }}
        </tr>
    {% endfor %}
    </table>
{% endfor %}

当然,这个模板只是伪代码,它不会起作用,因为,我猜,模板不应该按设计来做这件事。但另一方面,在我看来,必须预先计算平均金额也会让人感觉不对。这个问题应该怎么解决?

我还是 Django 的新手,所以我想知道这样做的“Django 方式”:)

【问题讨论】:

    标签: django django-templates django-aggregation


    【解决方案1】:

    这项工作应该在视图中完成。你说感觉不对,但这正是视图的目的:检索将要呈现给用户的数据。看看 Django 常见问题解答: http://docs.djangoproject.com/en/dev/faq/general/#django-appears-to-be-a-mvc-framework-but-you-call-the-controller-the-view-and-the-view-the-template-how-come-you-don-t-use-the-standard-names

    Django 看似是一个 MVC 框架,但你调用的是 Controller “视图”和视图 “模板”。你怎么不用 标准名称?

    在我们对 MVC 的解释中, “视图”描述了获取的数据 呈现给用户。它不是 必然是数据的样子,但是 显示了哪些数据。风景 描述你看到的数据,而不是如何 你看。这是一个微妙的区别。

    另外一点是,根据您在模板中使用平均值的方式,使用annotate 而不是aggregate 可能更有意义。 http://docs.djangoproject.com/en/1.1/ref/models/querysets/#annotate-args-kwargs

    【讨论】:

      【解决方案2】:

      模板不允许您调用带参数的函数。请参阅 here 了解他们让您做什么。

      处理此问题的规范方法是向模型添加一些辅助方法/管理器或创建custom template tag or filter

      【讨论】:

        猜你喜欢
        • 2010-12-01
        • 1970-01-01
        • 2011-09-02
        • 2021-10-13
        • 1970-01-01
        • 1970-01-01
        • 2019-12-06
        • 2020-06-13
        • 1970-01-01
        相关资源
        最近更新 更多