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" для всего списка голосов сразу? И в идеале вернуть его в виде словаря, который сопоставляет каждый голос с фильмом?
Если listOfOtherVotes
является QuerySet
, вы можете использовать .select_related(…)
[Django-doc] для внесения LEFT OUTER JOIN
в запрос, и таким образом получить детали связанных .movie
в том же запросе, избегая получения каждого .movie
дополнительным запросом:
for otherVote in listOfOtherVotes.select_related('movie'):
# …
movie = otherVote.movie
# …