Агрегирование Django в шаблонах? - PullRequest
0 голосов
/ 01 мая 2010

Я немного думаю о концепции агрегатов 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" сделать это:)

Ответы [ 2 ]

3 голосов
/ 01 мая 2010

Эта работа должна быть сделана в представлении. Вы говорите, что чувствуете себя неправильно, но это именно то, для чего предназначено представление: извлекать данные, которые будут представлены пользователю. Посмотрите на часто задаваемые вопросы по 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, но вы вызываете контроллер «вид», а вид «Шаблон». Почему вы не используете стандартные имена?

В нашей интерпретации MVC «Просмотр» описывает данные, которые получают представленный пользователю. Это не обязательно, как выглядят данные, но какие данные представлены. Вид описывает, какие данные вы видите, а не как ты видишь это. Это тонкое различие.

Побочным моментом этого является то, что в зависимости от того, как вы используете среднее значение в своем шаблоне, вероятно, было бы более разумно использовать annotate вместо aggregate. http://docs.djangoproject.com/en/1.1/ref/models/querysets/#annotate-args-kwargs

1 голос
/ 01 мая 2010

Шаблоны не позволяют вызывать функции, которые принимают аргументы. Смотрите здесь о том, что они позволяют вам делать.

Каноническим способом решения этой проблемы является добавление некоторых вспомогательных методов / менеджеров в ваши модели или создание пользовательского тега шаблона или фильтра .

...