|
@ -407,38 +407,6 @@ def hlavni_problemy_cisla(cislo): |
|
|
|
|
|
|
|
|
# vrátí slovník řešitel:body obsahující počty bodů zadaných řešitelů za daný ročník |
|
|
# vrátí slovník řešitel:body obsahující počty bodů zadaných řešitelů za daný ročník |
|
|
def body_resitelu_odjakziva(rocnik, resitele): |
|
|
def body_resitelu_odjakziva(rocnik, resitele): |
|
|
body_odjakziva = {} |
|
|
|
|
|
|
|
|
|
|
|
# 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[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) |
|
|
|
|
|
|
|
|
|
|
|
# Zkusíme agregovat: |
|
|
|
|
|
# Následující řádek přidá ke každému řešiteli údaj ".body" se součtem jejich bodů |
|
|
# Následující řádek přidá ke každému řešiteli údaj ".body" se součtem jejich bodů |
|
|
resitele_s_body = Resitel.objects.annotate(body=Sum('reseni__hodnoceni__body')) |
|
|
resitele_s_body = Resitel.objects.annotate(body=Sum('reseni__hodnoceni__body')) |
|
|
# Teď jen z QuerySetu řešitelů anotovaných body vygenerujeme slovník indexovaný řešitelským id obsahující body |
|
|
# Teď jen z QuerySetu řešitelů anotovaných body vygenerujeme slovník indexovaný řešitelským id obsahující body |
|
|