From 5958262240c11327da2c4a851ecf25f783831f11 Mon Sep 17 00:00:00 2001 From: Pavel 'LEdoian' Turinsky Date: Wed, 15 Apr 2020 23:18:14 +0200 Subject: [PATCH] =?UTF-8?q?Body=20odjak=C5=BEiva=20te=C4=8F=20po=C4=8D?= =?UTF-8?q?=C3=ADt=C3=A1=20datab=C3=A1ze?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seminar/views/views_all.py | 46 +++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/seminar/views/views_all.py b/seminar/views/views_all.py index 71eeb1b1..cf85096e 100644 --- a/seminar/views/views_all.py +++ b/seminar/views/views_all.py @@ -409,34 +409,38 @@ def hlavni_problemy_cisla(cislo): def body_resitelu_odjakziva(rocnik, resitele): body_odjakziva = {} - for r in resitele: - body_odjakziva[r.id] = 0 +# for r in resitele: +# body_odjakziva[str(r.id)] = 0 ######################################################################### # POZOR! Aktuálně počítá jen za posledních 10 let od zadaného ročníku # ######################################################################### - # Body za posledních 10 let je dobrá aproximace pro naše potřeby (výsledkovka - # s aktivními řešiteli) - - #body_pred_roky = [] - #rok = rocnik.prvni_rok - #rocniky = Rocnik.objects.filter(prvni_rok__gt=rok-11) - #for roc in rocniky: - # body_pred_roky.append(body_resitelu_za_rocnik(roc, resitele)) - # - #for r in resitele: - # for i in range(0,10): - # body_odjakziva[r.id] += body_pred_roky[i][r.id] +## # Body za posledních 10 let je dobrá aproximace pro naše potřeby (výsledkovka +## # s aktivními řešiteli) +## +## body_pred_roky = [] +## rok = rocnik.prvni_rok +## rocniky = Rocnik.objects.filter(prvni_rok__gt=rok-11) +## for roc in rocniky: +## body_pred_roky.append(body_resitelu_za_rocnik(roc, resitele)) +## +## for r in resitele: +## for i in range(0,10): +## body_odjakziva[str(r.id)] += body_pred_roky[i][str(r.id)] # Nasledující řešení je sice správné, ale moc pomalé: # (důsledek toho, že dotazy na joinování databázových tabulek jsou kvadratické) - for res in Reseni.objects.prefetch_related('resitele', 'hodnoceni_set').all(): - for r in res.resitele.all(): - # daný řešitel nemusí být v naší podmnožině - if r not in resitele: continue - - for hodn in res.hodnoceni_set.all(): - pricti_body(body_odjakziva, r, hodn.body) +# for res in Reseni.objects.prefetch_related('resitele', 'hodnoceni_set').all(): +# for r in res.resitele.all(): +# # daný řešitel nemusí být v naší podmnožině +# if r not in resitele: continue +# +# for hodn in res.hodnoceni_set.all(): +# pricti_body(body_odjakziva, r, hodn.body) + +# Zkusíme agregovat: + resitele_s_body = Resitel.objects.annotate(body=Sum('reseni__hodnoceni__body')) + body_odjakziva = {int(res.id) : res.body for res in resitele_s_body if res in resitele} return body_odjakziva # vrátí slovník řešitel:body obsahující počty bodů zadaných řešitelů za daný ročník