Как перебирать многомерный список / dict в шаблоне - PullRequest
1 голос
/ 19 мая 2019

Я пытаюсь перестроить этот пример: https://blog.roseman.org.uk/2010/01/11/django-patterns-part-2-efficient-reverse-lookups/

У меня есть модель "Продукт" и модель "Заказ". В заказе есть иностранный ключ к «продукту». Так что за 1 товар у меня N заказов

В моем шаблоне мне нужно отобразить много информации, поэтому я бы не хотел делать "заказ в Product.order_set.all ()" в моем шаблоне

В моем шаблоне, если я напишу:

{{ object_list.1.related_items }}

все хорошо и я получаю то, что хочу но если я напишу:

{% for i in object_list %}
    {{ object_list.i.related_items }}
{% endfor %}

Я не получил результат.

Может кто-нибудь сказать мне, как я решаю эту проблему?

Мой список объектов почти такой же, как в приведенном выше примере:

products = Product.objects.all()
i = 0
qs = Product.objects.all()
obj_dict = dict([(obj.id, obj) for obj in qs])
objects = Order.objects.filter(producttyp__in=qs)
relation_dict = {}
for obj in objects:
   relation_dict.setdefault(obj.producttyp_id, []).append(obj)
for id, related_items in relation_dict.items():
    obj_dict[id].related_items = related_items
def get(self,request,*args,**kwargs):
    context = {'object_list':self.obj_dict}
    return render(request,self.template_name,context)

единственное изменение, которое я сделал, это от obj_dict [id] ._ related_items to obj_dict [id] .related_items из-за недопустимого подчеркивания?!

Как распечатать список в моем шаблоне, например:

- Product A
    - Order 1
    - Order 2
    - Order 5
- Product B
    - Order 3
    - Order 6

С наилучшими пожеланиями

1 Ответ

0 голосов
/ 19 мая 2019

Это логично, поскольку здесь Django интерпретирует i не как переменную, а как идентификатор, поэтому он стремится получить доступ к object_list.i или object_list['i'], например, не object_list.1.

Вам, однако, здесь не нужно i, вы можете просто получить доступ к related_items из object, например:

{% for <b>object</b> in object_list %}
    {{ <b>object</b>.related_items }}
{% endfor %}

Если related_items, как следует из названия, является коллекциейкроме того, мы можем перебрать и эти элементы:

{% for object in object_list %}
    {% <b>for subitem in object.related_items</b> %}
        {{ subitem }}
    {% <b>endfor</b> %}
{% endfor %}

для словаря, мы можем получить доступ к .values, например:

{% for object in <b>object_dict.values</b> %}
    {{ object.related_items }}
{% endfor %}

EDIT : для конкретного случая просмотра списка.Вы можете использовать .prefetch_related для извлечения всех отношений одним дополнительным запросом:

class MyListView(ListView):
    queryset = Product.objects<b>.prefetch_related('order_set')</b>
    template = 'my_template.html'

В шаблоне вы можете отобразить это как:

<ul>
    {% for product in object_list %}
        <li>{{ product }}</li>
        <ul>
        {% for order in product.order_set %}
            <li>{{ order }}</li>
        {% endfor %}
        </ul>
    {% endfor %}
</ul>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...