我有以下型号:
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之前,我很好奇是否可以使用当前结构模拟该查询。
答案 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)