Можно ли отсортировать набор связанных элементов в шаблоне DJango?
То есть: этот код (теги HTML для ясности опущены):
{% for event in eventsCollection %}
{{ event.location }}
{% for attendee in event.attendee_set.all %}
{{ attendee.first_name }} {{ attendee.last_name }}
{% endfor %}
{% endfor %}
отображает почти точно хочу, я хочу. Единственное, что я хочу изменить, - это список участников, отсортированных по фамилии. Я пытался сказать что-то вроде этого:
{% for event in events %}
{{ event.location }}
{% for attendee in event.attendee_set.order_by__last_name %}
{{ attendee.first_name }} {{ attendee.last_name }}
{% endfor %}
{% endfor %}
Увы, приведенный выше синтаксис не работает (он генерирует пустой список), и ни один другой вариант, о котором я подумал (сообщается о множестве синтаксических ошибок, но не радует).
Я мог бы, конечно, создать какой-то массив отсортированных списков участников, на мой взгляд, но это уродливое и хрупкое (и я упомянул уродливое) решение.
Само собой разумеется, но я все равно скажу, я просмотрел онлайн-документы и искал переполнение стека и архивы пользователя django, не найдя ничего полезного (ах, если бы только набор запросов был словарным набором слов будет делать работу, но это не так, и это не так)
==============================================
Отредактировано, чтобы добавить дополнительные мысли
после принятия ответа Таумаса.
Таумас решил проблему именно так, как я ее представил - хотя решение оказалось не таким, как я ожидал. В результате я выучил полезную технику, которую можно использовать и в других ситуациях.
В ответе Тома был предложен подход, о котором я уже упоминал в своем ОП, и который якобы отклонил как «некрасивый».
"Уродливая" была внутренняя реакция, и я хотел уточнить, что с ней не так. При этом я понял, что причина того, что это был уродливый подход, заключалась в том, что я был одержим идеей передачи набора запросов в шаблон для визуализации. Если я ослаблю это требование, то у меня будет неприглядный подход.
Я еще не пробовал этого, но предположим, что вместо прохождения набора запросов код представления повторялся в наборе запросов, создавая список событий, а затем украшал каждое событие набором запросов для соответствующих участников, которые БЫЛО отсортировано (или отфильтровано, или как угодно) желаемым способом. Примерно так:
eventCollection = []
events = Event.object.[filtered and sorted to taste]
for event in events:
event.attendee_list = event.attendee_set.[filtered and sorted to taste]
eventCollection.append(event)
Теперь шаблон становится:
{% for event in events %}
{{ event.location }}
{% for attendee in event.attendee_list %}
{{ attendee.first_name }} {{ attendee.last_name }}
{% endfor %}
{% endfor %}
Недостатком является то, что представление должно «актуализировать» все события одновременно, что может быть проблемой, если существует большое количество событий. Конечно, можно добавить нумерацию страниц, но это значительно усложняет представление.
Положительным моментом является то, что код «подготовить данные для отображения» находится в представлении, к которому он принадлежит, что позволяет шаблону сосредоточиться на форматировании данных, представляемых представлением для отображения. Это правильно и правильно.
Так что я планирую использовать технику Таумаса для больших столов и вышеописанную технику для маленьких
таблицы с определением больших и малых оставлены читателю (с улыбкой.)