2009-02-10 3 views
5

Ich habe folgende Modelle:Wie verwende ich das Django ORM, um dieses Viele-zu-Viele-Beispiel abzufragen?

class Author(models.Model): 
    author_name = models.CharField() 

class Book(models.Model): 
    book_name = models.CharField() 

class AuthorBook(models.Model): 
    author_id = models.ForeignKeyField(Author) 
    book_id = models.ForeignKeyField(Book) 

Mit diesem wird gesagt, ich versuche diese Abfrage mit dem Django ORM zu emulieren (wählen Sie alle Bücher eines bestimmten Autors geschrieben, unter Hinweis darauf, dass Autoren viele haben Bücher und Bücher können viele Autoren) haben:

SELECT book_name 
FROM authorbook, book 
WHERE authorbook.author_id = 1 
AND authorbook.book_id = book.id 

I this FAQ page auf der Django Website gelesen habe, aber bevor ich meine Modellstruktur ändern und entfernen AuthorBook, war ich gespannt, ob ich die aktuelle Struktur emulieren könnte diese Abfrage mit .

Antwort

14

sollten Sie in der Lage sein zu tun:

books = Book.objects.filter(authorbook__author_id=1) 

ein QuerySet von Buchobjekten Ihrer author_id Einschränkung passend zu erhalten.

Das Schöne an Django ist, dass du es kochen und damit in der Schale herumspielen kannst. Sie können auch http://docs.djangoproject.com/en/dev/topics/db/queries/#spanning-multi-valued-relationships als nützlich finden.

+0

Argh. Danke - Gehirn funktioniert heute nur halb. :) – Huuuze

+0

webjunkie Antwort scheint besser. Ich habe gerade Django selbst gelernt. –

+0

Im Allgemeinen gibt es keinen Grund, das ID-Feld im ORM explizit zu erwähnen. Wenn Sie eine Autoreninstanz haben, möchten Sie Book.objects.filter (authorbook__author = author). Aber ein ManyToManyField ist natürlich der richtige Weg. –

14

"AuthorBook" scheint nicht korrekt modelliert.

sollten Sie ein ManyToManyField verwenden:

class Book(models.Model): 
    name = models.CharField() 
    authors = models.ManyToManyField(Author) 

Dann können Sie tun:

books = Book.objects.filter(authors__id=1) 
+1

+1 für das Vorschlagen von ManyToManyField (das ist der Django-Weg), -1 weil man nicht weiß, dass es so "unter der Haube" gemacht wird. – Javier

+5

Natürlich verwenden m2m-Beziehungen Zwischentabellen. Dennoch ist es in diesem Fall nicht korrekt mit Django modelliert. Es macht keinen Sinn, mich offen zu legen, dass ich weiß, wie es unter der Haube funktioniert. – webjunkie

Verwandte Themen