这可能是一个愚蠢的问题,但由于某种原因,我就是找不到这样做的方法:
我正在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"一次拿到所有的选票?然后理想地将其作为字典返回,将每个投票映射到电影?
如果listOfOtherVotes
是QuerySet
,则可以使用.select_related(…)
[Django-doc]在查询中创建LEFT OUTER JOIN
,从而在相同的查询中获取相关.movie
的详细信息,从而避免通过额外的查询获取每个.movie
:
for otherVote in listOfOtherVotes.select_related('movie'):
# …
movie = otherVote.movie
# …