Как использовать ORM Django для запроса этого примера «многие ко многим»? - PullRequest
5 голосов
/ 10 февраля 2009

У меня есть следующие модели:

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)

С учетом сказанного я пытаюсь эмулировать этот запрос с помощью ORM Django (выберите все книги, написанные конкретным автором, отметив, что у авторов может быть много книг, а у книг может быть много авторов):

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

Я прочитал эту страницу часто задаваемых вопросов на веб-сайте Django, но перед тем, как изменить структуру моей модели и удалить AuthorBook, мне было интересно, смогу ли я эмулировать этот запрос, используя текущую структуру.

Ответы [ 2 ]

14 голосов
/ 10 февраля 2009

«AuthorBook» выглядит неправильно смоделированным.

Вы должны использовать ManyToManyField:

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

Тогда вы можете сделать:

books = Book.objects.filter(authors__id=1)
14 голосов
/ 10 февраля 2009

Вы должны быть в состоянии сделать:

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

для получения объектов QuerySet of Book, соответствующих вашему ограничению author_id.

Хорошая вещь в Django - вы можете приготовить это и поиграть с ним в оболочке. Вы также можете найти http://docs.djangoproject.com/en/dev/topics/db/queries/#spanning-multi-valued-relationships быть полезным.

...