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

埃迪胡特

我有两个模型: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个以上参与者的演员?例如,我可以在过滤阶段执行此操作吗?

亚历山大·米哈托维奇(AleksandarMijatović)

您可以使用如下查询:

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

您访问FilmModelActorModel通过”related_name字段的对象,对通过count计数FilmModel与每个ActorModel对象相关对象数量命名新字段进行注释,然后仅过滤出计数值大于5的对象。

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Django的Q查询过滤多对多关系

来自分类Dev

基于多对多关系的Django查询

来自分类Dev

使用Gorm查询多对多关系

来自分类Dev

Laravel> 使用 Eloquent 查询多对多关系

来自分类Dev

与联接表的多对多关系

来自分类Dev

Django 多对多关系

来自分类Dev

NestJs使用联接表更新多对多关系

来自分类Dev

使用多对多关系实体框架强制内部联接

来自分类Dev

查询与DetachedCriteria的多对多关系

来自分类Dev

如何查询多对多关系?

来自分类Dev

LINQ查询多对多关系

来自分类Dev

播放-查询多对多关系

来自分类Dev

Yii多对多关系查询

来自分类Dev

休眠查询多对多关系

来自分类Dev

无法查询多对多关系

来自分类Dev

eloquent:查询多对多关系

来自分类Dev

Laravel 多对多关系查询

来自分类Dev

多对多关系的SQL查询

来自分类Dev

在Django的多对多关系中从查询集中排除对象

来自分类Dev

如何从多对多关系的属性中获取Django查询的值?

来自分类Dev

如何从多对多关系的属性中获取Django查询的值?

来自分类Dev

如何在Django上查询多对多关系?

来自分类Dev

Django - 查询以检查多对多关系字段中的项目

来自分类Dev

Django如何查询所有对象匹配的多对多关系

来自分类Dev

使用多对多关系mysql按标签ID搜索

来自分类Dev

Oracle递归联接-多对多关系

来自分类Dev

联接2个多对多关系表

来自分类Dev

多对多关系模型之间的内部联接

来自分类Dev

Ebean与联接的多对多关系失败