使用Count对Django进行多对多的注释和过滤

时间:2013-10-29 03:32:11

标签: django django-queryset

所以我有两个模型,PersonFilm,它们处于多对多的关系中。我的目标是拍摄一部电影,并输出至少出现在10部电影中的人物。

例如,我可以通过以下方式单独获得计数:

>>> Person.objects.get(short__istartswith = "Matt Damon").film_set.count()
71

但是,如果我尝试过滤特定电影的所有演员:

>>> Film.objects.get(name__istartswith="Saving Private Ryan").actors.all().annotate(film_count=Count('film')).filter(film_count__gte=10)
[]

它返回一个空集,因为如果我手动查看每个人的film_count它是1,即使像Matt Damon这样的演员(如上所示)已经在我的数据库中的71部电影中。

正如您在此查询中看到的那样,注释不起作用:

>>> Film.objects.get(name__istartswith="Saving Private Ryan").actors.all().annotate(film_count=Count('film'))[0].film_count
1
>>> Film.objects.get(name__istartswith="Saving Private Ryan").actors.all().annotate(film_count=Count('film'))[0].film_set.count()
7

我似乎无法找到通过film_set.count()

过滤它的方法

1 个答案:

答案 0 :(得分:0)

所以我认为一种方法,我不确定是最有效的查询,是先注释所有人,然后尝试根据电影和电影数过滤它:

Person.objects.annotate(film_count=Count('film')).filter(film__name__istartswith="Saving Private Ryan").filter(film_count__gte=10)