Wie verwende ich die die Django ORM dieses many-to-many Beispiel abfragen?
-
22-08-2019 - |
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.
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)