2010-01-28 22 views
5

Ho un modelli di Django che sono qualcosa di simile:query per un campo ManyToMany con Attraverso in Django

class Classification(models.Model): 
    name = models.CharField(choices=class_choices) 
    ... 

class Activity(models.Model): 
    name = models.CharField(max_length=300) 
    fee = models.ManyToManyField(Classification, through='Fee') 
    ... 

class Fee(models.Model): 
    activity = models.ForeignKey(Activity) 
    class = models.ForeignKey(Classification) 
    early_fee = models.IntegerField(decimal_places=2, max_digits=10) 
    regular_fee = models.IntegerField(decimal_places=2, max_digits=10) 

L'idea è che ci sarà una serie di tasse connesse con ogni coppia di attività e classificazione. La classificazione è simile a Student, Staff, ecc.

So che la parte funziona correttamente.

Poi nella mia richiesta, mi interrogo per una serie di attività con:

activities = Activity.objects.filter(...) 

che restituisce un elenco di attività. Devo mostrare nel mio modello quell'elenco di attività con le loro tariffe. Qualcosa di simile a questo:

Activity Name 
Student Early Price - $4 
Student Regular Price - $5 
Staff Early Price - $6 
Staff Regular Price - $8 

Ma non so di un modo semplice per ottenere queste informazioni senza una specifica interrogazione get delle Commissioni di oggetto per ogni coppia di attività/classe.

speravo questo dovrebbe funzionare:

activity.fee.all() 

Ma che solo restituisce l'oggetto di classificazione. C'è un modo per ottenere i dati dell'oggetto Fee per la coppia tramite le attività che ho già richiesto?

Oppure sto sbagliando tutto questo?

risposta

5

Considerando punta di michuk di rinominare "tassa" per "classificazione":

nome predefinito per gli oggetti Fee sul modello di attività sarà fee_set. Quindi, al fine di ottenere i vostri prezzi, fare questo:

for a in Activity.objects.all(): 
    a.fee_set.all() #gets you all fees for activity 

C'è una cosa, però, come si può vedere si finisce per fare 1 SELEZIONA su ogni oggetto di attività per le tasse, ci sono alcune applicazioni che possono aiutare con per esempio, django-batch-select fa solo 2 query in questo caso.

1

Prima di tutto penso che tu abbia definito il tuo campo sbagliato. Questo:

fee = models.ManyToManyField(Classification, through='Fee') 

dovrebbe essere piuttosto che:

classifications = models.ManyToManyField(Classification, through='Fee') 

come ManyToManyField si riferisce ad un elenco di oggetti correlati.

In generale ManyToManyField, AFAIK, è solo una scorciatoia di Django per abilitare il recupero di tutti gli oggetti correlati (Classificazione nel tuo caso), con la tabella di associazione trasparente al modello. Quello che vuoi è la tabella dell'associazione (Fee nel tuo caso) non essere trasparente.

Quindi quello che vorrei fare è rimuovere il campo ManyToManyField da Activity e ottenere semplicemente tutte le commissioni relative all'attività. E poi se hai bisogno di una classificazione per ogni tassa, ottieni la Classificazione separatamente.

Problemi correlati