mi sono imbattuto lo stesso problema in admin Django (versione 1.4.9), dove abbastanza semplici pagine di messa in vendita di amministrazione erano molto lento quando sostenuta da MySQL.
Nel mio caso è stato causato dal metodo ChangeList.get_query_set()
l'aggiunta di un eccessivamente ampia globale select_related()
alla query impostare se eventuali campi in list_display
erano molti-a-uno. Per un database corretto (tosse PostgreSQL tosse) questo non sarebbe un problema, ma è stato per MySQL ancora una volta che alcuni join sono stati attivati in questo modo.
La soluzione più pulita che ho trovato è stata quella di sostituire la direttiva globale select_related()
con una più mirata che ha unito solo le tabelle realmente necessarie. Questo è stato abbastanza facile da fare chiamando select_related()
con nomi di relazioni espliciti.
Questo approccio probabilmente finisce per scambiare i join nel database per più query di follow-up, ma se MySQL sta soffocando sulla query di grandi dimensioni, molte di esse potrebbero essere più veloci per te.
Ecco quello che ho fatto, più o meno:
from django.contrib.admin.views.main import ChangeList
class CarChangeList(ChangeList):
def get_query_set(self, request):
"""
Replace a global select_related() directive added by Django in
ChangeList.get_query_set() with a more limited one.
"""
qs = super(CarChangeList, self).get_query_set(request)
qs = qs.select_related('wheel') # Don't join on dealer or category
return qs
class CarAdmin(admin.ModelAdmin):
def get_changelist(self, request, **kwargs):
return CarChangeList
fonte
2014-02-20 17:17:45
Il 'select_related ('')' non ha funzionato per me, non ha impedito il verificarsi del join interno. Ma specificando 'list_select_related = []' nella classe admin ha fatto il trucco! – rednaw