2012-04-11 8 views
10

nehme die folgenden einfachen Modelle:Django und Reverse-Beziehungen von Fremdschlüsseln

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') 

Wie kann ich alle Autoren erhalten, die in einem bestimmten Blog teilgenommen (das heißt pk = 1)? Ich habe so etwas versucht, aber es hat nicht funktioniert.

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

Vielen Dank im Voraus!

+1

Haben Sie Klassenautor oder nicht? –

+0

Nein, warum ist das wichtig? Das Autorenmodell ist das Standardbenutzermodell. – Clash

+0

Sie können auch den Namen Ihres 'related_name' überdenken. Der zugehörige Name steht für Ihre Benutzerobjekte und wird auf den Eintragssatz abgebildet. Etwas wie 'related_name = 'entries' würde viel mehr Sinn ergeben. Auf diese Weise würde jedes Benutzerobjekt einen Eintrags-Abfrage-Satz haben. – dgel

Antwort

11
User.objects.filter(author_set__blog__pk=1) 

Ich habe nicht auf Ihren verwandten Namen geachtet, daher verwendet der obige Code (überarbeitet) jetzt den richtigen verwandten Namen. Dies ist jedoch ein wirklich schlechter verwandter Name. Der verwandte Name sollte beschreiben, was auf der gegenüberliegenden Seite ist, d. H. Entry. Also sollte es wirklich related_name='entry_set' sein. Aber das ist sowieso der Standard, also können Sie related_name entfernen, wenn Sie nur wollen. Ich würde normalerweise eine einfache pluralisierte Version der verwandten Klasse verwenden, die in diesem Fall related_name='entries' wäre. Oder Sie möchten etwas wie "blog_entries" verwenden, um genauer zu sein.

+0

Ich bemerkte gerade, dass User.Objects.filter (author_set__pk = 1) verfügbar ist. Wird mir das das gleiche Ergebnis geben? Danke im Voraus! – Clash

+3

Nein. Das wird 'User' zurückgeben, die Autoren des' Entry' sind mit pk = 1. Allerdings habe ich gerade aus Ihrem Kommentar erkannt, dass mein Code nicht ganz richtig ist. Siehe Aktualisierung. –

+0

Okay, vielen Dank nochmal! Ich habe deine Antwort akzeptiert. :) – Clash

Verwandte Themen