Na co uważać przy programowaniu? - iiuni/projektzapisy GitHub Wiki

Wydajne widoki

Widok jest funkcją, która odpowiada na pojedyncze zapytanie HTTP. Widoki umieszczamy zawsze w pliku views.py (jest to konwencja niewymuszona przez architekturę Django). Wykonywanie tej funkcji blokuje jeden (z kilku) wątków serwera HTTP, więc jeśli nie chcemy położyć serwera, musimy zapewnić, że widok szybko upora się ze swoim zadaniem.

Najwięcej czasu zajmuje czekanie na zasoby, więc należy upewnić się, że widok tego nie robi. Łatwym do popełnienia błędem jest zbyt wiele rund komunikacji z bazą danych. Na przykład bardzo łatwo jest pobrać z bazy danych wiele grup zajęciowych:

groups = Group.objects.filter(...)

a następnie w template'cie każdą z nich wypisać

{% for group in groups %}
    {{ group }}
{% endfor %}

Kod ten wywoła liniową liczbę zapytań do bazy danych — dla każdej grupy osobno spytamy o jej przedmiot oraz prowadzącego (trzy zapytania na każdą grupę), bo funkcja Group.str odwołuje się do tych danych.

Całą tę operację można załatwić jednym zapytaniem do bazy danych robiąc JOIN-y:

groups = Group.objects.filter(...).select_related('course', 'teacher', 'teacher__user')

Wnioski

  • Każdy widok powinien wykonywać stałą (niezależną od danych) liczbę zapytań do bazy danych.
  • Warto pisać testy automatyczne na liczbę zapytań wywoływanych przez widoki (docs).
  • Jeśli chcemy sprawdzić, jak operacje w ORM tłumaczą się na zapytania w SQL, warto zalogować się do maszyny wirtualnej, odpalić
    python manage.py shell
    
    i tam testować zapytania:
    groups = Group.objects.filter(...).select_related('course', 'teacher', 'teacher__user')
    print(groups.query)