Browse Source

Body odjakživa teď počítá databáze

middleware_test
Pavel 'LEdoian' Turinsky 5 years ago
parent
commit
5958262240
  1. 46
      seminar/views/views_all.py

46
seminar/views/views_all.py

@ -409,34 +409,38 @@ def hlavni_problemy_cisla(cislo):
def body_resitelu_odjakziva(rocnik, resitele): def body_resitelu_odjakziva(rocnik, resitele):
body_odjakziva = {} body_odjakziva = {}
for r in resitele: # for r in resitele:
body_odjakziva[r.id] = 0 # body_odjakziva[str(r.id)] = 0
######################################################################### #########################################################################
# POZOR! Aktuálně počítá jen za posledních 10 let od zadaného ročníku # # 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 ## # Body za posledních 10 let je dobrá aproximace pro naše potřeby (výsledkovka
# s aktivními řešiteli) ## # s aktivními řešiteli)
##
#body_pred_roky = [] ## body_pred_roky = []
#rok = rocnik.prvni_rok ## rok = rocnik.prvni_rok
#rocniky = Rocnik.objects.filter(prvni_rok__gt=rok-11) ## rocniky = Rocnik.objects.filter(prvni_rok__gt=rok-11)
#for roc in rocniky: ## for roc in rocniky:
# body_pred_roky.append(body_resitelu_za_rocnik(roc, resitele)) ## body_pred_roky.append(body_resitelu_za_rocnik(roc, resitele))
# ##
#for r in resitele: ## for r in resitele:
# for i in range(0,10): ## for i in range(0,10):
# body_odjakziva[r.id] += body_pred_roky[i][r.id] ## body_odjakziva[str(r.id)] += body_pred_roky[i][str(r.id)]
# Nasledující řešení je sice správné, ale moc pomalé: # 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é) # (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 res in Reseni.objects.prefetch_related('resitele', 'hodnoceni_set').all():
for r in res.resitele.all(): # for r in res.resitele.all():
# daný řešitel nemusí být v naší podmnožině # # daný řešitel nemusí být v naší podmnožině
if r not in resitele: continue # if r not in resitele: continue
#
for hodn in res.hodnoceni_set.all(): # for hodn in res.hodnoceni_set.all():
pricti_body(body_odjakziva, r, hodn.body) # 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 return body_odjakziva
# 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

Loading…
Cancel
Save