Omezit počet dotazů na DB při výpisu seznamů #133

Open
zelvuska wants to merge 1 commit from perf/select-related-managery into master
Owner

__str__ řady modelů sahá na související modely (typicky Řešitel → Osoba), takže každý výpis (admin, selecty ve formulářích) dělal dotaz na každý řádek.

Změny

  • SelectRelatedManager(*vazby) (various/models.py): výchozí manager, který zadané FK/OneToOne vazby načte rovnou v jednom dotazu. Nasazený na Resitel, Organizator, Prijemce, Deadline, Cislo, Nastaveni, Soustredeni_Ucastnici, Soustredeni_Organizatori, Konfery_Ucastnici, Seznam, Prednaska, Hlasovani, HlasovaniOZnalostech a Komentar.
  • Reseni, Hodnoceni: __str__ jde přes M2M, a to select_related neumí. Výchozí prefetch by přidal dotazy ke každému dotazu na řešení (výsledkovky ap.), proto je tu queryset s pro_vypis(), který volá jen admin. Reseni.__str__ používá .all() místo .first(), aby prefetch zabral.
  • HodnoceniAdmin: raw_id_fields = ['reseni'], protože formulář jinak vykresloval select se všemi ~25k řešeními. Mění se tím UI: místo selectu je políčko s ID a lupou.
  • ArchivView: prefetch_related_objects na čísla ročníků.
  • Formulář výpisu řešení počítal termíny třikrát.
  • Oprava Reseni_Resitele.__str__: odkazoval na neexistující self.resitel.

Měření (lokální DB)

před po
výpis 100 Řešitelů 101 1
výpis 100 Soustredeni_Ucastnici 301 1
výpis 100 Řešení (admin) 703 8
výpis 100 Hodnocení (admin) 1001 4
/org/reseni/ 76 32
/archiv/rocniky/ 84 35

makemigrations --check beze změn. Testy dopadají stejně jako na masteru (padá jen netrackovaný tests_old.py).

Přednášky a korektury lokálně nemají data: ověřené je jen to, že dotazy projdou, ne že se jejich počet snížil.

Co zbývá

  • Výsledková listina (~200 dotazů na Hodnocení po řešitelích) potřebuje přepsat výpočet, manager to nevyřeší.
  • Rocnik.verejne_vysledkovky_cisla() dělá dotaz na každý ročník v archivu.
  • Stránky s parametrem v URL nebyly procházené.

🤖 Generated with Claude Code

`__str__` řady modelů sahá na související modely (typicky Řešitel → Osoba), takže každý výpis (admin, selecty ve formulářích) dělal dotaz na každý řádek. ## Změny - **`SelectRelatedManager(*vazby)`** (`various/models.py`): výchozí manager, který zadané FK/OneToOne vazby načte rovnou v jednom dotazu. Nasazený na Resitel, Organizator, Prijemce, Deadline, Cislo, Nastaveni, Soustredeni_Ucastnici, Soustredeni_Organizatori, Konfery_Ucastnici, Seznam, Prednaska, Hlasovani, HlasovaniOZnalostech a Komentar. - **Reseni, Hodnoceni**: `__str__` jde přes M2M, a to `select_related` neumí. Výchozí prefetch by přidal dotazy ke každému dotazu na řešení (výsledkovky ap.), proto je tu queryset s `pro_vypis()`, který volá jen admin. `Reseni.__str__` používá `.all()` místo `.first()`, aby prefetch zabral. - **HodnoceniAdmin**: `raw_id_fields = ['reseni']`, protože formulář jinak vykresloval select se všemi ~25k řešeními. Mění se tím UI: místo selectu je políčko s ID a lupou. - **ArchivView**: `prefetch_related_objects` na čísla ročníků. - **Formulář výpisu řešení** počítal termíny třikrát. - **Oprava `Reseni_Resitele.__str__`**: odkazoval na neexistující `self.resitel`. ## Měření (lokální DB) | | před | po | |---|---|---| | výpis 100 Řešitelů | 101 | 1 | | výpis 100 Soustredeni_Ucastnici | 301 | 1 | | výpis 100 Řešení (admin) | 703 | 8 | | výpis 100 Hodnocení (admin) | 1001 | 4 | | `/org/reseni/` | 76 | 32 | | `/archiv/rocniky/` | 84 | 35 | `makemigrations --check` beze změn. Testy dopadají stejně jako na masteru (padá jen netrackovaný `tests_old.py`). Přednášky a korektury lokálně nemají data: ověřené je jen to, že dotazy projdou, ne že se jejich počet snížil. ## Co zbývá - Výsledková listina (~200 dotazů na Hodnocení po řešitelích) potřebuje přepsat výpočet, manager to nevyřeší. - `Rocnik.verejne_vysledkovky_cisla()` dělá dotaz na každý ročník v archivu. - Stránky s parametrem v URL nebyly procházené. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
__str__ řady modelů sahá na související modely (typicky Osoba), takže
každý výpis (admin, selecty ve formulářích) dělal dotaz na každý řádek.

- SelectRelatedManager(*vazby) ve various/models.py jako výchozí objects
  modelů, jejichž __str__ jde přes FK/OneToOne; navíc Cislo (rocnik)
  a Nastaveni (aktualni_cislo__rocnik, get_solo jde přes objects).
- Reseni a Hodnoceni: M2M nejde select_related a výchozí prefetch by
  zatížil všechny dotazy, proto queryset s pro_vypis() použitý v adminu.
  Reseni.__str__ používá .all() místo .first(), aby prefetch zabral.
- HodnoceniAdmin: raw_id_fields pro řešení (select s ~25k řešeními).
- ArchivView: prefetch_related_objects na čísla ročníků.
- Formulář výpisu řešení nepočítá termíny třikrát.
- Oprava Reseni_Resitele.__str__ (neexistující self.resitel).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This pull request can be merged automatically.
This branch is out-of-date with the base branch
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin perf/select-related-managery:perf/select-related-managery
git switch perf/select-related-managery

Merge

Merge the changes and update on Forgejo.

Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.

git switch master
git merge --no-ff perf/select-related-managery
git switch perf/select-related-managery
git rebase master
git switch master
git merge --ff-only perf/select-related-managery
git switch perf/select-related-managery
git rebase master
git switch master
git merge --no-ff perf/select-related-managery
git switch master
git merge --squash perf/select-related-managery
git switch master
git merge --ff-only perf/select-related-managery
git switch master
git merge perf/select-related-managery
git push origin master
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
mam/mamweb!133
No description provided.