Body odjakživa teď počítá databáze
This commit is contained in:
		
							parent
							
								
									e402f6c386
								
							
						
					
					
						commit
						5958262240
					
				
					 1 changed files with 25 additions and 21 deletions
				
			
		|  | @ -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…
	
		Reference in a new issue
	
	 Pavel 'LEdoian' Turinsky
						Pavel 'LEdoian' Turinsky