Массовая загрузка 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, или путем реализации заголовков кэширования.

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