Django QuerySet to return ManyToMany 字段中的唯一对象

Django QuerySet to return unique objects in ManyToMany fields

给定以下模型:

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 为我完成这项工作?谢谢!

就用后向关系

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

来自 Django docs

Reverse m2m queries are supported (i.e., starting at the table that doesn’t have a ManyToManyField):