Velke optimalizace SQL pouziti v adminu, select_related()
This commit is contained in:
		
							parent
							
								
									8e1e30e672
								
							
						
					
					
						commit
						692c73c7e2
					
				
					 2 changed files with 60 additions and 4 deletions
				
			
		|  | @ -21,6 +21,7 @@ class ResitelInline(admin.TabularInline): | |||
|     fields = ['jmeno', 'prijmeni', 'skola', 'mesto', 'rok_maturity', ] | ||||
|     readonly_fields = ['jmeno', 'prijmeni', 'skola', 'mesto', 'rok_maturity', ] | ||||
|     extra = 0 | ||||
| 
 | ||||
|     def has_add_permission(self, req): return False | ||||
| 
 | ||||
| 
 | ||||
|  | @ -29,6 +30,7 @@ class CisloInline(admin.TabularInline): | |||
|     fields = ['cislo', 'datum_vydani', 'datum_deadline', 'verejne_db', 'poznamka'] | ||||
|     readonly_fields = ['cislo'] | ||||
|     extra = 0 | ||||
| 
 | ||||
|     def has_add_permission(self, req): return False | ||||
| 
 | ||||
| 
 | ||||
|  | @ -36,6 +38,7 @@ class PrilohaReseniInline(admin.StackedInline): | |||
|     model = PrilohaReseni | ||||
|     fields = ['timestamp', 'soubor', 'poznamka'] | ||||
|     readonly_fields = ['timestamp'] | ||||
| 
 | ||||
|     extra = 0 | ||||
| 
 | ||||
| 
 | ||||
|  | @ -46,14 +49,39 @@ class ReseniKProblemuInline(admin.TabularInline): | |||
|     readonly_fields = ['timestamp'] | ||||
|     extra = 0 | ||||
| 
 | ||||
|     def get_queryset(self, request): | ||||
|         qs = super(ReseniKProblemuInline, self).get_queryset(request) | ||||
|         return qs.select_related('problem', 'cislo_body', 'resitel') | ||||
| 
 | ||||
|     # Potenciální DB HOG (cislo_body se dotazovalo na cisla pri kazdem zobrazeni jejich selectu ...) | ||||
|     def formfield_for_dbfield(self, db_field, **kwargs): | ||||
|         formfield = super(ReseniKProblemuInline, self).formfield_for_dbfield(db_field, **kwargs) | ||||
|         if db_field.name == 'cislo_body': | ||||
|             # dirty trick so queryset is evaluated and cached in .choices | ||||
|             formfield.choices = formfield.choices | ||||
|         return formfield | ||||
| 
 | ||||
| 
 | ||||
| class ReseniKResiteliInline(admin.TabularInline): | ||||
|     model = Reseni | ||||
|     fields = ['problem', 'forma', 'body', 'cislo_body', 'timestamp', 'poznamka'] | ||||
|     readonly_fields = ['timestamp', 'problem'] | ||||
|     extra = 0 | ||||
| 
 | ||||
|     def has_add_permission(self, req): return False | ||||
| 
 | ||||
|     def get_queryset(self, request): | ||||
|         qs = super(ReseniKResiteliInline, self).get_queryset(request) | ||||
|         return qs.select_related('problem', 'cislo_body', 'resitel') | ||||
| 
 | ||||
|     # Potenciální DB HOG (cislo_body se dotazovalo na cisla pri kazdem zobrazeni jejich selectu ...) | ||||
|     def formfield_for_dbfield(self, db_field, **kwargs): | ||||
|         formfield = super(ReseniKResiteliInline, self).formfield_for_dbfield(db_field, **kwargs) | ||||
|         if db_field.name == 'cislo_body': | ||||
|             # dirty trick so queryset is evaluated and cached in .choices | ||||
|             formfield.choices = formfield.choices | ||||
|         return formfield | ||||
| 
 | ||||
| 
 | ||||
| class Soustredeni_UcastniciInline(admin.TabularInline): | ||||
|     form = autocomplete_light.modelform_factory(Soustredeni_Ucastnici, autocomplete_fields=['resitel'], fields=['resitel']) | ||||
|  | @ -78,6 +106,10 @@ class ResitelAdmin(reversion.VersionAdmin): | |||
|     search_fields = ['jmeno', 'prijmeni', 'ulice', 'user', 'mesto', 'email'] | ||||
|     inlines = [ReseniKResiteliInline] | ||||
| 
 | ||||
|     def get_queryset(self, request): | ||||
|         qs = super(ResitelAdmin, self).get_queryset(request) | ||||
|         return qs.select_related('skola', 'user') | ||||
| 
 | ||||
| admin.site.register(Resitel, ResitelAdmin) | ||||
| 
 | ||||
| 
 | ||||
|  | @ -108,6 +140,9 @@ class CisloAdmin(reversion.VersionAdmin): | |||
|     list_display = ['kod', 'rocnik', 'cislo', 'datum_vydani', 'datum_deadline', 'verejne'] | ||||
|     list_filter = ['rocnik'] | ||||
|     view_on_site = Cislo.verejne_url | ||||
|     def get_queryset(self, request): | ||||
|         qs = super(CisloAdmin, self).get_queryset(request) | ||||
|         return qs.select_related('rocnik') | ||||
| 
 | ||||
| admin.site.register(Cislo, CisloAdmin) | ||||
| 
 | ||||
|  | @ -149,20 +184,27 @@ class ReseniAdmin(reversion.VersionAdmin): | |||
|         (u'Poznámky',       {'fields': ['poznamka']}), | ||||
|         ] | ||||
|     readonly_fields = ['timestamp'] | ||||
|     list_display = ['problem', 'resitel', 'forma', 'body', 'timestamp'] | ||||
|     list_display = ['problem', 'resitel', 'forma', 'body', 'timestamp', 'cislo_body'] | ||||
|     list_filter = ['body', 'timestamp', 'forma'] | ||||
|     search_fields = [] | ||||
|     inlines = [PrilohaReseniInline] | ||||
| 
 | ||||
|     def get_queryset(self, request): | ||||
|         qs = super(ReseniAdmin, self).get_queryset(request) | ||||
|         return qs.select_related('resitel', 'problem', 'cislo_body') | ||||
| 
 | ||||
| admin.site.register(Reseni, ReseniAdmin) | ||||
| 
 | ||||
| 
 | ||||
| ### Problem | ||||
| 
 | ||||
| from autocomplete_light.contrib.taggit_field import TaggitField, TaggitWidget | ||||
| 
 | ||||
| #TODO: Autocomplete autor/opravovatel | ||||
| class ProblemAdminForm(forms.ModelForm): | ||||
|     text_problemu = forms.CharField(widget=CKEditorWidget()) | ||||
|     text_problemu_org = forms.CharField(widget=CKEditorWidget()) | ||||
|     zamereni = TaggitField(widget=TaggitWidget('TagAutocomplete')) | ||||
|     class Meta: | ||||
|         model = Problem | ||||
|         exclude = [] | ||||
|  | @ -182,6 +224,11 @@ class ProblemAdmin(reversion.VersionAdmin): | |||
|     inlines = [ReseniKProblemuInline] | ||||
|     view_on_site = Problem.verejne_url | ||||
| 
 | ||||
|     def get_queryset(self, request): | ||||
|         qs = super(ProblemAdmin, self).get_queryset(request) | ||||
|         return qs.select_related('autor', 'opravovatel', 'cislo_zadani', 'cislo_reseni') | ||||
| 
 | ||||
| 
 | ||||
| admin.site.register(Problem, ProblemAdmin) | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -54,6 +54,7 @@ class Skola(SeminarModelBase): | |||
|         db_table = 'seminar_skoly' | ||||
|         verbose_name = u'Škola' | ||||
|         verbose_name_plural = u'Školy' | ||||
|         ordering = ['mesto', 'nazev'] | ||||
| 
 | ||||
|     # Interní ID | ||||
|     id = models.AutoField(primary_key = True) | ||||
|  | @ -238,7 +239,7 @@ class Cislo(SeminarModelBase): | |||
|         db_table = 'seminar_cisla' | ||||
|         verbose_name = u'Číslo' | ||||
|         verbose_name_plural = u'Čísla' | ||||
|         ordering = ['rocnik__rocnik', 'cislo'] | ||||
|         ordering = ['rocnik_id', 'cislo'] | ||||
| 
 | ||||
|     # Interní ID | ||||
|     id = models.AutoField(primary_key = True) | ||||
|  | @ -264,7 +265,9 @@ class Cislo(SeminarModelBase): | |||
|     kod.short_description = u'Kód čísla' | ||||
| 
 | ||||
|     def __str__(self): | ||||
|         return force_unicode(u'%s' % (self.kod(),)) | ||||
|         #TODO: DB HOG | ||||
|         #return force_unicode(u'%s' % (self.kod(),)) | ||||
|         return force_unicode(u'%s' % (self.cislo,)) | ||||
| 
 | ||||
|     def verejne(self): | ||||
|         return self.verejne_db | ||||
|  | @ -297,6 +300,7 @@ class Problem(SeminarModelBase): | |||
|         db_table = 'seminar_problemy' | ||||
|         verbose_name = u'Problém' | ||||
|         verbose_name_plural = u'Problémy' | ||||
|         ordering = ['nazev'] | ||||
| 
 | ||||
|     # Interní ID | ||||
|     id = models.AutoField(primary_key = True) | ||||
|  | @ -382,7 +386,7 @@ class Reseni(SeminarModelBase): | |||
|         db_table = 'seminar_reseni' | ||||
|         verbose_name = u'Řešení' | ||||
|         verbose_name_plural = u'Řešení' | ||||
|         ordering = ['problem', 'resitel'] | ||||
|         ordering = ['problem_id', 'resitel_id'] | ||||
| 
 | ||||
|     # Interní ID | ||||
|     id = models.AutoField(primary_key = True) | ||||
|  | @ -412,6 +416,7 @@ class Reseni(SeminarModelBase): | |||
| 
 | ||||
|     def __str__(self): | ||||
|         return force_unicode(u"%s: %s (%sb)" % (self.resitel.plne_jmeno(), self.problem.nazev, self.body)) | ||||
|         #TODO: DB HOG | ||||
| 
 | ||||
| 
 | ||||
| # PrilohaReseni method | ||||
|  | @ -511,6 +516,7 @@ class Soustredeni_Ucastnici(models.Model): | |||
| 
 | ||||
|     def __str__(self): | ||||
|         return force_unicode(u'%s na %s' % (self.resitel, self.soustredeni, )) | ||||
|         #TODO: DB HOG | ||||
| 
 | ||||
| 
 | ||||
| @python_2_unicode_compatible | ||||
|  | @ -533,6 +539,7 @@ class VysledkyBase(SeminarModelBase): | |||
| 
 | ||||
|     def __str__(self): | ||||
|         return force_unicode(u"%s: %sb (%s)" % (self.resitel.plne_jmeno(), self.body, str(self.cislo))) | ||||
|         #NOTE: DB HOG (ale nepouzivany) | ||||
| 
 | ||||
| @python_2_unicode_compatible | ||||
| class VysledkyZaCislo(VysledkyBase): | ||||
|  | @ -543,6 +550,7 @@ class VysledkyZaCislo(VysledkyBase): | |||
|         managed = False | ||||
| 
 | ||||
|     def __str__(self): | ||||
|         #NOTE: DB HOG (ale nepouzivany) | ||||
|         return force_unicode(u"%s: %sb (za %s)" % (self.resitel.plne_jmeno(), self.body, str(self.cislo))) | ||||
| 
 | ||||
| 
 | ||||
|  | @ -557,6 +565,7 @@ class VysledkyKCislu(VysledkyBase): | |||
|     body_celkem = models.IntegerField(u'body celkem do čísla', db_column='body_celkem') | ||||
| 
 | ||||
|     def __str__(self): | ||||
|         #NOTE: DB HOG (ale nepouzivany) | ||||
|         return force_unicode(u"%s: %sb / %sb (do %s)" % (self.resitel.plne_jmeno(), self.body, self.body_celkem, str(self.cislo))) | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Tomas Gavenciak
						Tomas Gavenciak