5

我有以下型号:

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 网站上的这个 FAQ 页面,但是在我修改我的模型结构并删除 AuthorBook 之前,我很好奇是否可以使用当前结构模拟该查询。

4

2 回答 2

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 很有用。

于 2009-02-10T19:21:36.880 回答
14

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

您应该使用ManyToManyField

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

然后你可以这样做:

books = Book.objects.filter(authors__id=1)
于 2009-02-10T19:28:58.970 回答