Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Django按连接数查询多对多关系_Python_Django_Database_Many To Many_Django Queryset - Fatal编程技术网

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

Python 使用Django按连接数查询多对多关系,python,django,database,many-to-many,django-queryset,Python,Django,Database,Many To Many,Django Queryset,我有两个模型: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.

我有两个模型: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
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)
我想过滤我的ActorModel中任何与FilmModel有5个以上连接的实例。我可以这样做:

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
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.objects.filter(actors__imdb_id=str(name)).count()
您可以通过
相关的\u name
字段访问
FilmModel
ActorModel对象,通过计算与每个
ActorModel
对象相关的
FilmModel
对象的数量来注释名为
count
的新字段,然后仅过滤出计数值大于5的对象

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

more_than_five_films = ActorModel.objects.annotate(count=Count('film_actors')).filter(count__gt=5) 
FilmModel.objects.filter(actors__imdb_id=str(name)).count()

感谢您仍在努力实施-您能提供建议吗?谢谢!非常有帮助!很乐意帮忙!如果您认为答案有帮助,请将其标记为已接受答案(绿色勾选)和/或投赞成票。