È possibile ordinare una serie di elementi correlati in un modello DJango?
Ovvero: questo codice (con tag HTML omessi per chiarezza):
{% for event in eventsCollection %}
{{ event.location }}
{% for attendee in event.attendee_set.all %}
{{ attendee.first_name }} {{ attendee.last_name }}
{% endfor %}
{% endfor %}
mostra quasi esattamente quello che voglio. L'unica cosa che voglio cambiare è l'elenco dei partecipanti da ordinare per cognome. Ho provato a dire qualcosa del genere:
{% for event in events %}
{{ event.location }}
{% for attendee in event.attendee_set.order_by__last_name %}
{{ attendee.first_name }} {{ attendee.last_name }}
{% endfor %}
{% endfor %}
Purtroppo, la sintassi di cui sopra non funziona (produce un elenco vuoto) e nemmeno qualsiasi altra variazione a cui ho pensato (molti errori di sintassi segnalati, ma nessuna gioia).
Potrei, ovviamente, produrre una sorta di serie di elenchi di partecipanti ordinati a mio avviso, ma questa è una soluzione brutta e fragile (e ho menzionato brutta).
Inutile dirlo, ma lo dirò comunque, ho esaminato i documenti in linea e cercato Stack Overflow e gli archivi di django-user senza trovare nulla di utile (ah, se solo un set di query fosse un dizionario, dictsort farebbe il lavoro, ma non lo è e non lo è)
==============================================
Modificato per aggiungere ulteriori pensieri dopo aver accettato la risposta di Tawmas.
Tawmas ha affrontato il problema esattamente come l'ho presentato, sebbene la soluzione non fosse quella che mi aspettavo. Di conseguenza ho imparato una tecnica utile che può essere utilizzata anche in altre situazioni.
La risposta di Tom proponeva un approccio che avevo già menzionato nel mio PO e rifiutato provvisoriamente come "brutto".
Il "brutto" è stata una reazione istintiva, e volevo chiarire cosa c'era di sbagliato in esso. In tal modo mi sono reso conto che il motivo per cui era un approccio brutto era perché ero bloccato all'idea di passare un set di query al modello da renderizzare. Se allento questo requisito, c'è un approccio sgradevole che dovrebbe funzionare.
Non l'ho ancora provato, ma supponiamo che invece di passare il set di query, il codice di visualizzazione abbia iterato attraverso il set di query producendo un elenco di eventi, quindi decorato ogni evento con un set di query per i partecipanti corrispondenti che È STATO ordinato (o filtrato, o qualsiasi altra cosa) nel modo desiderato. Qualcosa di simile:
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)
Ora il modello diventa:
{% for event in events %}
{{ event.location }}
{% for attendee in event.attendee_list %}
{{ attendee.first_name }} {{ attendee.last_name }}
{% endfor %}
{% endfor %}
Lo svantaggio è che la vista deve "attualizzare" tutti gli eventi contemporaneamente, il che potrebbe essere un problema se ci fosse un gran numero di eventi. Ovviamente si potrebbe aggiungere l'impaginazione, ma questo complica notevolmente la vista.
Il vantaggio è che il codice "prepara i dati da visualizzare" è nella vista a cui appartiene, lasciando che il modello si concentri sulla formattazione dei dati forniti dalla vista per la visualizzazione. Questo è giusto e corretto.
Quindi il mio piano è quello di utilizzare la tecnica di Tawmas per i tavoli grandi e la tecnica sopra per i tavoli piccoli, con la definizione di grande e piccolo lasciata al lettore (ghigno).