Слишком долгая перезагрузка страницы Django
У меня есть некоторые проблемы с временем перезагрузки некоторых страниц в django, оно занимает слишком много времени. Я использую debug_toolbar и он показывает мне Browser timing request: 4 (+113577)
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 сек даже меньше)!