MPTT - Как я могу передать дополнительные данные для каждого узла в шаблон? - PullRequest
0 голосов
/ 28 марта 2012

Учитывая следующее view:

def comments(request):

    comments_list = Thing.objects.filter(thing_type=2)
    #Thing model extends MPTTModel 
    comments_extra_data_list = Data.objects.filter(thing__in=comments_list)
    #Data objects have data for each Thing

    return render_to_response("comments.html",
                      {'nodes':comments_list},
                        context_instance=RequestContext(request))

Как я могу передать comments_extra_data_list в шаблон для отображения данных для каждого узла в дереве MPTT?

1 Ответ

3 голосов
/ 28 марта 2012

Если у вас есть эти модели:

class Thing(MPTTModel):
    ...
    thing_type = models.IntegerField(default=0)

class Data(models.Model):
    thing = models.ForeignKey(Thing, related_name="data_set")

Вы можете просто сделать это в своем шаблоне:

{% recursetree nodes %}
    <h1>{{ node }}</h1>
    {% for data in node.data_set.all %}
        {{ data.something }}
    {% endfor %}
    ...
{% endrecursetree %}

Это наивный подход. Он будет выполнять один запрос к базе данных (извлекать связанные Data объекты) для каждого Thing.

Если вы используете django 1.4, вам следует предварительно извлечь объекты данных в вашем представлении, чтобы он не выполнял так много запросов:

comments = Thing.objects.filter(thing_type=2)
comments = comments.prefetch_related('data_set')

https://docs.djangoproject.com/en/dev/ref/models/querysets/#prefetch-related

...