Слишком долгая перезагрузка страницы Django

У меня есть некоторые проблемы с временем перезагрузки некоторых страниц в django, оно занимает слишком много времени. Я использую debug_toolbar и он показывает мне Browser timing request: 4 (+113577) enter image description here

models.py

class Subsidiary(models.Model):
    name = models.CharField(unique=True, max_length=100, blank=False)

    def __str__(self):
        return self.name

class Department(models.Model):
    name = models.CharField(unique=True, max_length=200, blank=False,)

    def __str__(self):
        return self.name

class SubBudget(models.Model):
    name = models.CharField(max_length=100, unique=True, blank=False)

    def __str__(self):
        return self.name

class SubBudgetOwner(models.Model):
    budget_owner = models.ForeignKey(Person, models.PROTECT, related_name="budgets_owned")
    sub_budget_owner = models.ForeignKey(Person, models.PROTECT, related_name="sub_budgets_owned")

    class Meta:
        ordering = ["id"]
        unique_together = (("budget_owner", "sub_budget_owner"),)
        verbose_name = "Budget Owner"  # Title on the maint page for this table
        verbose_name_plural = "Budget Owners"  # Title for the navbar navigation

    def __str__(self):
        return str(self.budget_owner) + " - " + str(self.sub_budget_owner)


class Combination(models.Model):
    id = models.AutoField(primary_key=True)
    subsidiary = models.ForeignKey(Subsidiary, verbose_name="Subsidiary", null=True, blank=True, on_delete=models.CASCADE,)
    department = models.ForeignKey(Department, verbose_name="Department", on_delete=models.CASCADE,)
    sub_budget = models.ForeignKey(SubBudget, verbose_name="Sub Budget", on_delete=models.CASCADE,)
    budget_owner = models.ForeignKey(SubBudgetOwner, verbose_name="Budget Owner & Sub Budget Owner", null=True, blank=True, on_delete=models.CASCADE,)

    def __str__(self):
        return (f"{self.subsidiary} {self.department} {self.sub_budget} {self.budget_owner}")

    class Meta:
        ordering = ["id"]

Мой views.py

class CombinationListView(LoginRequiredMixin, ListView):
    model = Combination
    template_name = "budget/combination_list.html"

Что я могу сделать, чтобы улучшить его?

ТНХ парень

Вы делаете 11k запросов на этой странице. Это занимает 46 секунд. Вам следует начать с уменьшения количества запросов.

Вам следует начать с проверки того, можете ли вы использовать select_related или prefetch_related для улучшения запросов, генерируемых вашим шаблоном.

Так что я нашел решение. Я добавил функцию queryset (CombinationQuerySet), и она делает волшебство

В моем model.py:

class CombinationQuerySet(models.QuerySet):
    def fast(self):
        return self.select_related(
            "subsidiary",
            "department",
            "sub_budget",
            "budget_owner__budget_owner",
            "budget_owner__sub_budget_owner",
        )

class Combination(models.Model):
    id = models.AutoField(primary_key=True)
    subsidiary = models.ForeignKey(Subsidiary, verbose_name="Subsidiary", null=True, blank=True, on_delete=models.CASCADE,)
    department = models.ForeignKey(Department, verbose_name="Department", on_delete=models.CASCADE,)
    sub_budget = models.ForeignKey(SubBudget, verbose_name="Sub Budget", on_delete=models.CASCADE,)
    budget_owner = models.ForeignKey(SubBudgetOwner, verbose_name="Budget Owner & Sub Budget Owner", null=True, blank=True, on_delete=models.CASCADE,)

    objects = CombinationQuerySet.as_manager()

    def __str__(self):
        return (f"{self.subsidiary} {self.department} {self.sub_budget} {self.budget_owner}")

    class Meta:
        ordering = ["id"]

my view.py (добавлена строка: queryset = Combination.objects.fast()):

class CombinationListView(LoginRequiredMixin, ListView):
    model = Combination
    template_name = "budget/combination_list.html"
    queryset = Combination.objects.fast()

Я увидел, что это улучшило загрузку страницы намного быстрее (1 сек даже меньше)!

Вернуться на верх