[Python] Ordinamento di elementi correlati in un modello Django


Answers

È possibile utilizzare il filtro modello dictsort https://docs.djangoproject.com/en/dev/ref/templates/builtins/#std:templatefilter-dictsort

Questo dovrebbe funzionare:

{% for event in eventsCollection %}
   {{ event.location }}
   {% for attendee in event.attendee_set.all|dictsort:"last_name" %}
     {{ attendee.first_name }} {{ attendee.last_name }}
   {% endfor %}
 {% endfor %}
Question

È possibile ordinare una serie di articoli correlati in un modello di DJango?

Cioè: 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 %}

visualizza quasi esattamente voglio 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 una lista vuota) e non fa nessuna altra variazione che ho pensato (molti errori di sintassi riportati, ma nessuna gioia).

Potrei, naturalmente, produrre una sorta di matrice di elenchi di partecipanti ordinati a mio avviso, ma questa è una soluzione brutta e fragile (e ho detto brutto).

Inutile dire, ma lo dirò comunque, ho esaminato i documenti on-line e ho cercato e gli archivi di Django-user senza trovare nulla di utile (ah, se solo un set di query fosse un dizionario che dictsort avrebbe fatto lavoro, ma non lo è e non lo fa)

==============================================

Modificato per aggiungere ulteriori pensieri dopo aver accettato la risposta di Tawmas.

Tawmas ha affrontato la questione esattamente come l'avevo presentata, anche se la soluzione non era quella che mi aspettavo. Di conseguenza ho imparato una tecnica utile che può essere utilizzata anche in altre situazioni.

La risposta di Tom ha proposto un approccio che avevo già menzionato nel mio PO e che ho rifiutato provvisoriamente di essere "brutto".

Il "brutto" era una reazione istintiva, e volevo chiarire cosa c'era che non andava. Così facendo mi sono reso conto che il motivo per cui si trattava di un approccio brutto è stato il fatto di essere stato bloccato dall'idea di passare una query impostata sul modello da rendere. Se rilasso questa esigenza, c'è un approccio brutto che dovrebbe funzionare.

Non ho ancora provato questo, ma supponiamo che piuttosto che passare il queryset, il codice di vista iterato attraverso il set di query producendo un elenco di eventi, quindi decorato ogni evento con una query impostata per i partecipanti corrispondenti che è stata ordinata (o filtrata, o qualsiasi altra cosa) nel modo desiderato. Qualcosa del genere:

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. Naturalmente si potrebbe aggiungere l'impaginazione, ma ciò complica notevolmente la vista.

Il lato positivo è 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 è usare la tecnica di Tawmas per i tavoli grandi e la tecnica di cui sopra per i tavoli di piccole dimensioni, con la definizione di grandi e piccoli lasciati al lettore (sorriso).






Links