【问题标题】:Django QuerySet to return unique objects in ManyToMany fieldsDjango QuerySet 在 ManyToMany 字段中返回唯一对象
【发布时间】:2015-03-05 15:37:33
【问题描述】:

鉴于以下模型:

class Author(models.Model):
  name = models.CharField()

class Book(models.Model):
  title = models.CharField()
  published_year = models.PositiveIntegerField()
  authors = models.ManyToManyField(Author)

假设我想获取所有在 2008 年出版过一本书的作者。我可以执行以下操作:

Book.objects.filter(published_year=2008).values_list('authors__name').distinct()

这会给我一个作者列表——几乎正是我想要的,除了名字,我想要作者对象。我可以通过这样做来实现这一点:

authors = []
for b in Book.objects.filter(published_year=2008):
  for a in b.authors.all():
    if a not in authors:
      authors.append(a)

但这似乎完全没有必要。是否可以让 QuerySet 为我完成这项工作?谢谢!

【问题讨论】:

    标签: django orm django-queryset


    【解决方案1】:

    只使用后向关系

    Author.objects.filter(book__published_year=2008).all()
    

    来自 Django docs

    支持反向 m2m 查询(即,从表 没有 ManyToManyField):

    【讨论】:

    • 在我发布的示例的更简单的世界中,这确实可行。我的真实情况要复杂得多,但这将作为一个起点。谢谢!
    • @BrettGmoser 在我发布的 djang 文档链接中,有更复杂的示例。
    • Author 拥有 book_set 的事实是关键。我得到的东西正是我想要的:books = Book.objects.filter(...) # later on Author.objects.filter(book_set__in=[b for b in books.all()])
    猜你喜欢
    • 2017-12-23
    • 2012-06-22
    • 2012-02-04
    • 2014-05-27
    • 2019-11-11
    • 2013-05-19
    • 2016-09-05
    • 2014-06-20
    相关资源
    最近更新 更多