Есть две вещи, которые вы можете сделать. Во-первых, используйте cached_property
для кэширования метода, чтобы он уменьшал количество вызовов БД для повторных обращений к одному и тому же объекту.
from django.utils.functional import cached_property
@cached_property
def get_absolute_url(self):
kwargs = {
'show_slug': self.podcast.slug,
'pk': self.id,
'slug': self.slug
}
return reverse('episode_page', kwargs=kwargs)
Или лучше: кэшированное свойство, отличное от get_absolute_url
.
cached_absolute_url = cached_property(get_absolute_url)
Во-вторых, вы можете использовать select_related
для предварительной загрузки данных FK. Например:
episodes = Episode.objects.select_related('podcast').all()
for e in episodes:
e.get_absolute_url()