2012-04-11 27 views
10

supporre i seguenti modelli semplici:Django e invertire i rapporti di chiavi esterne

class Blog(models.Model): 
    name = models.CharField(max_length=100) 
    tagline = models.TextField() 

class Entry(models.Model): 
    blog = models.ForeignKey(Blog) 
    headline = models.CharField(max_length=255) 
    body_text = models.TextField() 
    author = models.ForeignKey(User, related_name='author_set') 

Come posso ottenere tutti gli autori che hanno partecipato a un blog particolare (cioè pk = 1)? Ho provato qualcosa di simile, ma non ha funzionato.

User.objects.author_set.filter(blog=Blog.objects.get(pk=1)) 

Molte grazie in anticipo!

+1

Hai anche un autore di classe o no? –

+0

No, perché questo importa? Il modello autore è il modello utente predefinito. – Clash

+0

Puoi anche riconsiderare il nome del tuo 'related_name'. Il nome correlato è ciò che sarà sugli oggetti User, mappando al set di voci. Qualcosa come 'related_name = 'entries'' avrebbe molto più senso. In questo modo ogni oggetto User avrebbe un queryset di voci. – dgel

risposta

11
User.objects.filter(author_set__blog__pk=1) 

non stavo prestando attenzione al vostro nome correlato, in modo che il codice di cui sopra (rivisto) ora utilizza il nome relativo corretta. Tuttavia, questo è il in realtà il nome correlato. Il nome correlato dovrebbe descrivere ciò che si trova sul lato opposto, ad esempio Entry. Quindi in realtà dovrebbe essere related_name='entry_set'. Tuttavia, questo è il default in ogni caso, quindi è possibile rimuovere related_name se si desidera solo quello. In genere utilizzerei una semplice versione pluralizzata della classe correlata, che sarebbe in questo caso related_name='entries'. Oppure, potresti voler usare qualcosa come "blog_entries" per essere più specifico.

+0

ho notato che User.objects.filter (author_set__pk = 1) è disponibile. Questo mi darà lo stesso risultato? Grazie in anticipo! – Clash

+3

No. Ciò restituirà 'User's che sono autori di' Entry' con pk = 1. Tuttavia, ho appena realizzato dal tuo commento che il mio codice non è corretto. Vedi l'aggiornamento. –

+0

ok, molte grazie ancora! Ho accettato la tua risposta. :) – Clash

Problemi correlati