2009-07-28 15 views
5

Come è possibile eseguire un ordinamento complesso su un oggetto prima di passarlo al modello? Ad esempio, ecco il mio punto di vista:Ordinamento e indicizzazione in un elenco in un modello Django?

@login_required 
def overview(request): 
    physicians = PhysicianGroup.objects.get(pk=physician_group).physicians 

for physician in physicians.all(): 
    physician.service_patients.order_by('bed__room__unit', 'bed__room__order', 'bed__order') 

return render_to_response('hospitalists/overview.html', RequestContext(request, {'physicians': physicians,})) 

L'oggetto medico non viene ordinato correttamente nel modello. Perchè no?

Inoltre, come si fa a indicizzare in un elenco all'interno del modello? Ad esempio, (questo non funziona):

{% for note_type in note_types %} 
    <div><h3>{{ note_type }}</h3> 
    {% for notes in note_sets.index(parent.forloop.counter0) %} 
    #only want to display the notes of this note_type! 
     {% for note in notes %} 
     <p>{{ note }}</p> 
     {% endfor %} 
    {% endfor %} 
    </div> 
{% endfor %} 

Grazie mille, Pete

+0

@Peter Mortensen, perché vai in giro per la rimozione di gratitudine da parte i messaggi delle persone? Vedi la tua revisione n. 8 di questa domanda. Non lo trovo accettabile. – slypete

risposta

11

Come altri hanno indicato, è possibile risolvere entrambi i problemi al di fuori del modello, sia nei modelli, sia nella vista. Una strategia sarebbe quella di aggiungere metodi di supporto alle classi pertinenti.

Ottenere un elenco ordinato dei pazienti di un medico:

class Physician(Model): 
    ... 
    def sorted_patients(self): 
     return self.patients.order_by('bed__room__unit', 
            'bed__room__order', 
            'bed__order') 

E nel modello, utilizzare physician.sorted_patients piuttosto che physician.patients.

Per "visualizzare le note di questo note_type", sembra che si desideri un metodo notes per la classe note_type. Dalla tua descrizione non sono sicuro se questa è una classe del modello o no, ma il principio è lo stesso:

class NoteType: 
    ... 
    def notes(self): 
     return <calculate note set> 

E poi il modello:

{% for note_type in note_types %} 
    <div><h3>{{ note_type }}</h3></div> 
    {% for note in note_type.notes %} 
     <p>{{ note }}</p> 
    {% endfor %} 
    </div> 
{% endfor %} 
+0

Grazie, per me è un po 'difficile capire che quasi nulla può essere fatto nel modello!Neanche indicizzazione in una lista! – slypete

+0

Nelle versioni recenti di django puoi * indicizzare * in una lista. –

4

"Mi piacerebbe fare questo all'interno di un modello:"

Non . Fallo nella funzione di visualizzazione a cui appartiene.

Poiché la domanda è incompleta, è impossibile indovinare il modello di dati e fornire la soluzione esatta.

results= physician.patients.order_by('bed__room__unit', 'bed__room__order', 'bed__order') 

Dovrebbe essere sufficiente. Fornire results al modello per il rendering. È nell'ordine corretto.

Se questo non è l'ordinamento corretto (forse a causa di qualche modello sottilmente), allora avete sempre questo tipo di alternativa.

def by_unit_room_bed(patient): 
    return patient.bed.room.unit, patient.bed.room.order, patient.bed.order 

patient_list = list(physician.patients) 
patient_list.sort(key=by_unit_room_bed) 

Fornire patient_list al modello per il rendering. È nell'ordine corretto.

"come si fa a indice in una lista all'interno del template"

Non sono sicuro di quello che stai cercando di fare, ma il più delle volte, la risposta è "non". Fallo nella funzione di visualizzazione.

Il modello si limita a scorrere semplici elenchi che si riempiono di semplici modelli HTML.

Se sembra troppo complesso per un modello, lo è. Mantieni il modello semplice: è solo una presentazione. Il trattamento va nella funzione di visualizzazione

+0

Come proponi di ordinare gli oggetti all'interno dell'oggetto prima di passarli alla vista? Ad esempio, questo non funziona: physician.service_patients = physician.service_patients.all(). Order_by ('bed__room__unit', 'bed__room__order', 'bed__order') – slypete

+0

Cosa intendi per "non funziona". Cosa fa di sbagliato? –

+0

L'assegnazione rende l'oggetto inutilizzabile poiché service_patients è un ForeignKey. – slypete

1

Si dovrebbe essere in grado di costruire la query ordinata impostato nella vista e passarlo al modello:

def myview(request): 
    patients = Physician.patients.order_by('bed__room__unit', 
              'bed__room__order', 
              'bed__order') 
    return render_to_response('some_template.html', 
           dict(patients=patients), 
           mimetype='text/html') 

Il modello può quindi eseguire un ciclo su patients che conterrà l'ordinato risultati. Questo non funziona per te?

MODIFICA: per l'indicizzazione, utilizzare la sintassi del punto: mylist.3 in un modello diventa mylist[3] in python. Vedere http://docs.djangoproject.com/en/dev/ref/templates/api/#rendering-a-context per ulteriori informazioni.

+0

No, non da quando sono passato in un medico impostato sul modello. È possibile ordinare i pazienti di ogni medico nel set medico prima di passarlo al modello? – slypete

+0

Immagino di poter passare un set di medici e una lista di serie di pazienti ordinati, ma non mi sembra giusto ... se capisci cosa intendo. Preferisco solo passare in un set e ho capito che non so come farlo. – slypete

+0

Ho pensato che il medico fosse un modello e che i pazienti fossero un manager modello. Immagino che potresti creare un metodo di istanza su un medico: get_patients, che restituisce solo una serie di query di pazienti ordinati. Dovresti essere in grado di chiamarlo in un modello e iterare sul set di risultati. – ars

0

Questo è un modo di farlo , anche se molto brutta:

{% for note in note_sets|slice:"forloop.counter0"|first %}

+0

Siamo spiacenti, questo non funziona. Ho appena provato. –

+0

lol, questo è cattivo. – slypete

Problemi correlati