为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Django 按连接数查询多对多关系

使用 Django 按连接数查询多对多关系

凤凰求蛊 2023-08-22 17:49:35
我有两个模型: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我想过滤我的 ActorModel 中与 FilmModel 有超过 5 个连接的任何实例。我可以这样做: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 个连接的参与者?例如,我可以在过滤阶段执行此操作吗?
查看完整描述

1 回答

?
慕后森

TA贡献1802条经验 获得超5个赞

您可以使用这样的查询:

more_than_five_films = ActorModel.objects.annotate(count=Count('film_actors')).filter(count__gt=5)

您访问through字段FilmModel的对象,通过计算与每个对象相关的对象数量来注释新字段,然后仅过滤掉计数值大于 5 的对象。ActorModelrelated_namecountFilmModelActorModel

对于您提供的代码的建议len()是永远不要在查询集上使用,因为它会评估整个查询,这是昂贵的并且不需要,因为您只需要一个计数值。您应该使用count()与返回数字相同的函数len()。它看起来像这样:

FilmModel.objects.filter(actors__imdb_id=str(name)).count()


查看完整回答
反对 回复 2023-08-22
  • 1 回答
  • 0 关注
  • 158 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信