Хиты базы данных для связанного объекта в get_absolute_url в django - PullRequest
1 голос
/ 30 января 2020

Я создаю приложение, которое перечисляет подкасты и их эпизоды.

На странице подкаста мне нужно перечислить эпизоды со ссылками на отдельные страницы эпизодов. Чтобы сделать понятные человеку URL-адреса, я использую слаг для подкаста и эпизода. Это вызывает много обращений к базе данных. Вот функция get_absolute_url:

    def get_absolute_url(self):
        kwargs = {
            'show_slug': self.podcast.slug,
            'pk': self.id,
            'slug': self.slug
        }
        return reverse('episode_page', kwargs=kwargs)

Как мне сделать эту базу данных более эффективной, потому что для шоу с сотнями эпизодов это много запрашивает базу данных.

1 Ответ

1 голос
/ 30 января 2020

Есть две вещи, которые вы можете сделать. Во-первых, используйте 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...