Массовая загрузка Django
Я хочу загружать страницу быстрее в моем проекте Django, поэтому я знаю, что там есть опция "Bulk".
views.py:
class HRListView(Budgetlevel2Mixin, BudgetMixin, LoginRequiredMixin, ListView):
model = HR
template_name = "budget/hr_list.html"
models.py:
class HR(models.Model):
year_scenario_version = models.ForeignKey(
measure_name = models.ForeignKey(
employee_type = models.ForeignKey(
employee_level = models.ForeignKey(
subsidiary = models.ForeignKey(
department = models.ForeignKey(
currency = models.ForeignKey(
hr_list.html:
{% block thead %}
<tr>
<th>ID</th>
<th>HR Year Scenario</th>
<th>Measure Name</th>
<th>Employee Type</th>
<th>Employee Level</th>
<th>Subsidiary</th>
<th>Department</th>
</tr>
{% endblock %}
{% block tbody %}
{% for q in object_list %}
<tr>
<td>{{ q.id }}</td>
<td>{{ q.year_scenario_version }}</td>
<td>{{ q.measure_name }}</td>
<td>{{ q.employee_type }}</td>
<td>{{ q.employee_level }}</td>
<td>{{ q.subsidiary }}</td>
<td>{{ q.department }}</td>
</tr>
{% endfor %}
{% endblock %}
Как я могу улучшить время загрузки страницы? Для полной загрузки требуется почти 10 сек, что-то около 1200 записей.
Большое спасибо!
Поскольку все ваши поля HR являются внешними ключами, и вы не выполнили их предварительную выборку, обращение к каждому полю в каждой строке является BD-хитом.
Попробуйте добавить в ListView:
def get_queryset():
return HR.objects.select_related("year_scenario_version", "measure_name", "employee_type", "employee_level", "subsidiary", "departement")
Вы действительно правы, что массовые операции могут значительно ускорить работу. Вам следует:
Prefetch related fields [Django-doc] Используйте пагинацию, чтобы не загружать в память сразу 1200 объектов Используйте индексы базы данных для ускорения поиска. Кэшируйте страницу, чтобы повторные посещения были быстрее Сократите количество логики в шаблоне
Так что вы можете изменить представление на: class HRListView(Budgetlevel2Mixin, BudgetMixin, LoginRequiredMixin, ListView): model = HR template_name = "budget/hr_list.html"
def get_queryset(self):
return super().get_queryset().prefetch_related(
'year_scenario_version', 'measure_name', 'employee_type',
'employee_level', 'subsidiary', 'department', 'currency'
)
и использовать пагинацию, например, с помощью Django Paginator в шаблоне. Кроме того, вы можете убедиться, что у вас есть индексы:
HR.year_scenario_version_id HR.имя_меры_ид и т.д.
для ускорения поиска. Наконец, вы можете реализовать кэширование, например, с помощью тега шаблона cache, или с помощью django-cacheback, или путем реализации заголовков кэширования.