如何使用Django ORM查询这个多对多的例子?

时间:2009-02-10 19:12:06

标签: python django 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之前,我很好奇是否可以使用当前结构模拟该查询。

2 个答案:

答案 0 :(得分:14)

你应该可以这样做:

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

获取与您的author_id限制匹配的Book对象的QuerySet。

关于Django的好处是你可以烹饪它并在shell中玩它。你也可以找到 http://docs.djangoproject.com/en/dev/topics/db/queries/#spanning-multi-valued-relationships 有用。

答案 1 :(得分:14)

“AuthorBook”似乎没有正确建模。

您应该使用ManyToManyField

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

然后你可以这样做:

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