Django QuerySet返回ManyToMany字段中的唯一对象

时间:2015-03-05 15:37:34

标签: django orm django-queryset

鉴于以下模型:

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

1 个答案:

答案 0 :(得分:1)

只需使用落后关系

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

来自Django docs

  

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