【问题标题】:How do I use the Django ORM to query this many-to-many example?如何使用 Django ORM 查询这个多对多示例?
【发布时间】:2010-10-06 17:33:30
【问题描述】:

我有以下型号:

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

【问题讨论】:

    标签: python django django-orm


    【解决方案1】:

    你应该可以做到:

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

    【讨论】:

    • webjunkie 的反应似乎更好。只是自己学习 Django。
    • 一般来说,没有理由在 ORM 中明确提及 id 字段。假设您有一个 Author 实例,您需要 Book.objects.filter(authorbook__author=author)。当然,ManyToManyField 是必经之路。
    • 另一个按作者姓名查找的示例:Book.objects.filter(authors__author_name__endswith=u' Klein') 假设您使用的是基于 webjunkie 的 ManyToMany 架构。
    【解决方案2】:

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

    你应该使用ManyToManyField:

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

    那么你可以这样做:

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

    【讨论】:

    • +1 表示建议 ManyToManyField(这是 Django 的方式),-1 表示不知道它是如何“在幕后”完成的。
    • m2m 关系当然使用中间表。在这种情况下,它仍然没有使用 Django 正确建模。让我明确表示我知道它是如何工作的毫无意义。
    猜你喜欢
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 2023-03-03
    • 2019-04-22
    • 2019-08-16
    相关资源
    最近更新 更多