Frage

Ich habe die folgenden Modelle:

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 zu emulieren die Django ORM (wählen Sie alle, die von einem bestimmten Autor geschrieben Bücher, unter Hinweis darauf, dass Autoren viele Bücher haben und Bücher viele Autoren haben können):

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

Ich habe gelesen dieser FAQ-Seite auf der Django-Website, aber bevor ich meine Modellstruktur modifizieren und entfernen AuthorBook, war ich gespannt, ob ich diese Abfrage mit der aktuellen Struktur emulieren kann.

War es hilfreich?

Lösung

Sie sollten in der Lage sein zu tun:

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

ein QuerySet des Buches erhalten Objekte Ihre author_id Einschränkung entsprechen.

Die nette Sache über Django ist, dass Sie diese nach oben kochen und mit ihm in der Schale herumzuspielen. Sie können auch feststellen, http://docs.djangoproject.com/ en / dev / Themen / db / Abfragen / # spanning-mehrwertig-Beziehungen nützlich sein.

Andere Tipps

"AuthorBook" scheint nicht korrekt modelliert.

Sie sollten eine 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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top