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

Huu*_*uze 5 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)
Run Code Online (Sandbox Code Playgroud)

话虽如此,我正在尝试使用Django ORM来模拟这个查询(选择特定作者编写的所有书籍,注意作者可以有很多书,书籍可以有很多作者):

SELECT book_name 
FROM authorbook, book
WHERE authorbook.author_id = 1
AND authorbook.book_id = book.id
Run Code Online (Sandbox Code Playgroud)

我在Django网站上阅读了这个FAQ页面,但在我修改模型结构并删除AuthorBook之前,我很好奇是否可以使用当前结构模拟该查询.

Emi*_*Sit 14

你应该能够做到:

books = Book.objects.filter(authorbook__author_id=1)
Run Code Online (Sandbox Code Playgroud)

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

关于Django的好处是你可以做这个并在shell中玩它.您可能还会发现 http://docs.djangoproject.com/en/dev/topics/db/queries/#spanning-multi-valued-relationships 非常有用.


web*_*kie 14

"AuthorBook"似乎没有正确建模.

你应该使用ManyToManyField:

class Book(models.Model):
  name = models.CharField()
  authors = models.ManyToManyField(Author)
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

books = Book.objects.filter(authors__id=1)
Run Code Online (Sandbox Code Playgroud)

  • 当然m2m关系使用中间表.在这种情况下,仍然没有使用Django正确建模.让我明白我知道它是如何在幕后工作是没有意义的. (5认同)