0

我在思考Django 聚合的概念。我不太“明白”在我的情况下如何使用它们。基本上我的模型中有一个三层的对象层次结构,最低的对象(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 方式”:)

4

2 回答 2

3

这项工作应该在视图中完成。你说感觉不对,但这正是视图的本意:检索将要呈现给用户的数据。查看 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 称为“视图”,而将 View 称为“模板”。你怎么不使用标准名称?

在我们对 MVC 的解释中,“视图”描述了呈现给用户的数据。不一定是数据的外观,而是呈现哪些数据。该视图描述了您看到的数据,而不是您如何查看它。这是一个微妙的区别。

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

于 2010-04-30T20:21:20.273 回答
1

模板不允许您调用带参数的函数。看看这里他们让你做什么。

处理此问题的规范方法是向模型添加一些辅助方法/管理器,或者创建自定义模板标签或过滤器

于 2010-04-30T20:23:31.127 回答