Browse Source

Velke optimalizace SQL pouziti v adminu, select_related()

remotes/origin/feincms
Tomas Gavenciak 10 years ago
parent
commit
692c73c7e2
  1. 49
      seminar/admin.py
  2. 15
      seminar/models.py

49
seminar/admin.py

@ -21,6 +21,7 @@ class ResitelInline(admin.TabularInline):
fields = ['jmeno', 'prijmeni', 'skola', 'mesto', 'rok_maturity', ] fields = ['jmeno', 'prijmeni', 'skola', 'mesto', 'rok_maturity', ]
readonly_fields = ['jmeno', 'prijmeni', 'skola', 'mesto', 'rok_maturity', ] readonly_fields = ['jmeno', 'prijmeni', 'skola', 'mesto', 'rok_maturity', ]
extra = 0 extra = 0
def has_add_permission(self, req): return False 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'] fields = ['cislo', 'datum_vydani', 'datum_deadline', 'verejne_db', 'poznamka']
readonly_fields = ['cislo'] readonly_fields = ['cislo']
extra = 0 extra = 0
def has_add_permission(self, req): return False def has_add_permission(self, req): return False
@ -36,6 +38,7 @@ class PrilohaReseniInline(admin.StackedInline):
model = PrilohaReseni model = PrilohaReseni
fields = ['timestamp', 'soubor', 'poznamka'] fields = ['timestamp', 'soubor', 'poznamka']
readonly_fields = ['timestamp'] readonly_fields = ['timestamp']
extra = 0 extra = 0
@ -46,14 +49,39 @@ class ReseniKProblemuInline(admin.TabularInline):
readonly_fields = ['timestamp'] readonly_fields = ['timestamp']
extra = 0 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): class ReseniKResiteliInline(admin.TabularInline):
model = Reseni model = Reseni
fields = ['problem', 'forma', 'body', 'cislo_body', 'timestamp', 'poznamka'] fields = ['problem', 'forma', 'body', 'cislo_body', 'timestamp', 'poznamka']
readonly_fields = ['timestamp', 'problem'] readonly_fields = ['timestamp', 'problem']
extra = 0 extra = 0
def has_add_permission(self, req): return False 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): class Soustredeni_UcastniciInline(admin.TabularInline):
form = autocomplete_light.modelform_factory(Soustredeni_Ucastnici, autocomplete_fields=['resitel'], fields=['resitel']) 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'] search_fields = ['jmeno', 'prijmeni', 'ulice', 'user', 'mesto', 'email']
inlines = [ReseniKResiteliInline] 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) admin.site.register(Resitel, ResitelAdmin)
@ -108,6 +140,9 @@ class CisloAdmin(reversion.VersionAdmin):
list_display = ['kod', 'rocnik', 'cislo', 'datum_vydani', 'datum_deadline', 'verejne'] list_display = ['kod', 'rocnik', 'cislo', 'datum_vydani', 'datum_deadline', 'verejne']
list_filter = ['rocnik'] list_filter = ['rocnik']
view_on_site = Cislo.verejne_url 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) admin.site.register(Cislo, CisloAdmin)
@ -149,20 +184,27 @@ class ReseniAdmin(reversion.VersionAdmin):
(u'Poznámky', {'fields': ['poznamka']}), (u'Poznámky', {'fields': ['poznamka']}),
] ]
readonly_fields = ['timestamp'] readonly_fields = ['timestamp']
list_display = ['problem', 'resitel', 'forma', 'body', 'timestamp'] list_display = ['problem', 'resitel', 'forma', 'body', 'timestamp', 'cislo_body']
list_filter = ['body', 'timestamp', 'forma'] list_filter = ['body', 'timestamp', 'forma']
search_fields = [] search_fields = []
inlines = [PrilohaReseniInline] 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) admin.site.register(Reseni, ReseniAdmin)
### Problem ### Problem
from autocomplete_light.contrib.taggit_field import TaggitField, TaggitWidget
#TODO: Autocomplete autor/opravovatel #TODO: Autocomplete autor/opravovatel
class ProblemAdminForm(forms.ModelForm): class ProblemAdminForm(forms.ModelForm):
text_problemu = forms.CharField(widget=CKEditorWidget()) text_problemu = forms.CharField(widget=CKEditorWidget())
text_problemu_org = forms.CharField(widget=CKEditorWidget()) text_problemu_org = forms.CharField(widget=CKEditorWidget())
zamereni = TaggitField(widget=TaggitWidget('TagAutocomplete'))
class Meta: class Meta:
model = Problem model = Problem
exclude = [] exclude = []
@ -182,6 +224,11 @@ class ProblemAdmin(reversion.VersionAdmin):
inlines = [ReseniKProblemuInline] inlines = [ReseniKProblemuInline]
view_on_site = Problem.verejne_url 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) admin.site.register(Problem, ProblemAdmin)

15
seminar/models.py

@ -54,6 +54,7 @@ class Skola(SeminarModelBase):
db_table = 'seminar_skoly' db_table = 'seminar_skoly'
verbose_name = u'Škola' verbose_name = u'Škola'
verbose_name_plural = u'Školy' verbose_name_plural = u'Školy'
ordering = ['mesto', 'nazev']
# Interní ID # Interní ID
id = models.AutoField(primary_key = True) id = models.AutoField(primary_key = True)
@ -238,7 +239,7 @@ class Cislo(SeminarModelBase):
db_table = 'seminar_cisla' db_table = 'seminar_cisla'
verbose_name = u'Číslo' verbose_name = u'Číslo'
verbose_name_plural = u'Čísla' verbose_name_plural = u'Čísla'
ordering = ['rocnik__rocnik', 'cislo'] ordering = ['rocnik_id', 'cislo']
# Interní ID # Interní ID
id = models.AutoField(primary_key = True) id = models.AutoField(primary_key = True)
@ -264,7 +265,9 @@ class Cislo(SeminarModelBase):
kod.short_description = u'Kód čísla' kod.short_description = u'Kód čísla'
def __str__(self): 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): def verejne(self):
return self.verejne_db return self.verejne_db
@ -297,6 +300,7 @@ class Problem(SeminarModelBase):
db_table = 'seminar_problemy' db_table = 'seminar_problemy'
verbose_name = u'Problém' verbose_name = u'Problém'
verbose_name_plural = u'Problémy' verbose_name_plural = u'Problémy'
ordering = ['nazev']
# Interní ID # Interní ID
id = models.AutoField(primary_key = True) id = models.AutoField(primary_key = True)
@ -382,7 +386,7 @@ class Reseni(SeminarModelBase):
db_table = 'seminar_reseni' db_table = 'seminar_reseni'
verbose_name = u'Řešení' verbose_name = u'Řešení'
verbose_name_plural = u'Řešení' verbose_name_plural = u'Řešení'
ordering = ['problem', 'resitel'] ordering = ['problem_id', 'resitel_id']
# Interní ID # Interní ID
id = models.AutoField(primary_key = True) id = models.AutoField(primary_key = True)
@ -412,6 +416,7 @@ class Reseni(SeminarModelBase):
def __str__(self): def __str__(self):
return force_unicode(u"%s: %s (%sb)" % (self.resitel.plne_jmeno(), self.problem.nazev, self.body)) return force_unicode(u"%s: %s (%sb)" % (self.resitel.plne_jmeno(), self.problem.nazev, self.body))
#TODO: DB HOG
# PrilohaReseni method # PrilohaReseni method
@ -511,6 +516,7 @@ class Soustredeni_Ucastnici(models.Model):
def __str__(self): def __str__(self):
return force_unicode(u'%s na %s' % (self.resitel, self.soustredeni, )) return force_unicode(u'%s na %s' % (self.resitel, self.soustredeni, ))
#TODO: DB HOG
@python_2_unicode_compatible @python_2_unicode_compatible
@ -533,6 +539,7 @@ class VysledkyBase(SeminarModelBase):
def __str__(self): def __str__(self):
return force_unicode(u"%s: %sb (%s)" % (self.resitel.plne_jmeno(), self.body, str(self.cislo))) 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 @python_2_unicode_compatible
class VysledkyZaCislo(VysledkyBase): class VysledkyZaCislo(VysledkyBase):
@ -543,6 +550,7 @@ class VysledkyZaCislo(VysledkyBase):
managed = False managed = False
def __str__(self): 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))) 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') body_celkem = models.IntegerField(u'body celkem do čísla', db_column='body_celkem')
def __str__(self): 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))) return force_unicode(u"%s: %sb / %sb (do %s)" % (self.resitel.plne_jmeno(), self.body, self.body_celkem, str(self.cislo)))

Loading…
Cancel
Save