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
    # …
Вернуться на верх