2009-02-10 35 views
5

我有以下型號:如何使用Django ORM查詢這個多對多的例子?

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) 

有了這樣說,我想效仿使用Django的ORM(選擇所有的由特定作者所寫的書此查詢,並指出,作者可以有很多書籍和圖書可以有多個作者):

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

我Django的網站上閱讀this FAQ page,但在此之前我修改我的模型結構,並刪除AuthorBook,我很好奇,如果我可以使用當前的結構模仿該查詢。

回答

14

你應該能夠做到:

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

拿到書的QuerySet一個對象符合AUTHOR_ID限制。

關於Django的好處是你可以做到這一點,並在殼中玩耍。您也可能發現 http://docs.djangoproject.com/en/dev/topics/db/queries/#spanning-multi-valued-relationships 有用。

+0

哎呀。謝謝 - 大腦今天只有一半工作。 :) – Huuuze 2009-02-10 19:24:49

+0

webjunkie的回覆似乎更好。只是自己學習Django。 – 2009-02-10 19:38:49

14

「AuthorBook」似乎沒有正確建模。

您應該使用ManyToManyField

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

然後,你可以這樣做:

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