我有两个模型:ActorModel和FilmModel加入如下:
FilmModel(models.Model):
actors = models.ManyToManyField(Actor, blank=True, related_name='film_actors')
ActorModel(models.Model):
name = models.CharField(max_length=40)
def __str__(self):
return self.imdb_id
我想为任何具有FilmModel超过5个连接的实例过滤ActorModel。我可以这样做,如下所示:
actors = ActorModel.objects.all()
more_than_five_films = []
for actor in actors:
actor_film_list = FilmModel.objects.filter(actors__imdb_id=str(name))
if len(actor_film_list)>5:
more_than_five_films.append(actor)
但是,使用上面的代码需要大量的处理能力。有没有更有效的方法来查找5个以上参与者的演员?例如,我可以在过滤阶段执行此操作吗?
您可以使用如下查询:
more_than_five_films = ActorModel.objects.annotate(count=Count('film_actors')).filter(count__gt=5)
您访问FilmModel
“ActorModel
通过”related_name
字段的对象,对通过count
计数FilmModel
与每个ActorModel
对象相关的对象数量命名的新字段进行注释,然后仅过滤出计数值大于5的对象。
您提供的代码建议不要len()
在查询集上使用,因为它会评估整个查询,这很昂贵,不需要,因为您只需要一个计数值。您应该使用count()
返回数字的函数len()
。看起来像这样:
FilmModel.objects.filter(actors__imdb_id=str(name)).count()
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句