Python 使用Django按连接数查询多对多关系
我有两个模型:ActorModel和FilmModel,如下所示: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.
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()
感谢您仍在努力实施-您能提供建议吗?谢谢!非常有帮助!很乐意帮忙!如果您认为答案有帮助,请将其标记为已接受答案(绿色勾选)和/或投赞成票。