Django:是否可以批量获取对象列表的字段值?



这可能是一个愚蠢的问题,但由于某种原因,我就是找不到这样做的方法:

我正在Django里做一个推荐引擎,它会根据你和其他用户的喜好来推荐电影。由于每次数据库访问都需要时间,所以我尽量使用批量方法。然而,在某一时刻,我需要获得与某一投票相关联的电影,我只是不知道如何批量执行此操作:

相关模型为:

class Movie(models.Model):
id = models.AutoField(primary_key=True)
...
voters = models.ManyToManyField(Voter)
...

class MovieVote(models.Model):
rating = models.FloatField()
weight = models.FloatField()
voter = models.ForeignKey(Voter, on_delete=models.CASCADE, null=True)
movie = models.ForeignKey(Movie, on_delete=models.CASCADE, null=True)
...

而目前占用整个推荐过程80%(!)时间的一行是:

for otherVote in listOfOtherVotes:
...    
movie = otherVote.movie
...

有没有办法查找外键"movie"一次拿到所有的选票?然后理想地将其作为字典返回,将每个投票映射到电影?

如果listOfOtherVotesQuerySet,则可以使用.select_related(…)[Django-doc]在查询中创建LEFT OUTER JOIN,从而在相同的查询中获取相关.movie的详细信息,从而避免通过额外的查询获取每个.movie:

for otherVote in listOfOtherVotes.select_related('movie'):
# …
movie = otherVote.movie
# …

最新更新