0

Django 集計の概念について少し考えています。私の場合、それらをどのように使用できるかはよくわかりません。基本的に、モデルには 3 層のオブジェクト階層があり、最下層のオブジェクト (バー) には集計したい値が含まれています。

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 FAQ をご覧ください: 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 フレームワークのように見えますが、コントローラーを「ビュー」、ビューを「テンプレート」と呼んでいます。なぜ標準的な名前を使用しないのですか?

MVC の解釈では、「ビュー」はユーザーに提示されるデータを表します。それは必ずしもデータがどのように見えるかではなく、どのデータが表示されるかです。ビューは、どのようにデータを表示するかではなく、どのデータを表示するかを説明します。微妙な違いです。

これに対する補足的な点は、テンプレートで平均をどのように使用しているかに基づいてannotateaggregate. 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 に答える