Django过滤具有至少一个具有value属性的多对多对象

时间:2014-02-25 21:13:20

标签: python django django-orm

我希望使用Django的ORM进行复杂的过滤。

型号:

class Book(models.Model):
    title = models.TextField()
    bestseller = models.BooleanField(default=False)

class Author(models.Model):
    name = models.TextField()
    books = models.ManytoManyField(Book)

我如何查询至少拥有一本畅销书的所有作者?

查询:

best_authors = Author.objects.filter(<relevant filter>)

修改

根据documentation,以下内容应该有效:

best_authors = Author.objects.filter(books__bestseller=True)

不幸的是,最终会返回重复的作者对象(他/她的每本畅销书的同一作者,一遍又一遍)。

1 个答案:

答案 0 :(得分:7)

best_authors = Author.objects.filter(books__bestseller=True).distinct()

filter()使用JOIN表执行Books并生成bestseller==True的所有行。 distinct()确保每位作者仅在结果中列出一次。