2012-10-27 17 views
10

Alcune delle mie visualizzazioni in Django Admin impiegano troppo tempo per essere caricate. Qual è il modo migliore per eseguire il debug di una vista di Django Admin per vedere che cosa è un ciclo di masticazione?Debugging slow Django Admin views

+6

https://github.com/django-debug-toolbar/django-debug-toolbar#readme – rantanplan

+0

si può provare aggiungere 'list_select_related = true' proprietà data classe di amministrazione – yedpodtrzitko

risposta

9

Come ha commentato rantanplan, django debug toolbar è il modo più semplice per iniziare la profilatura (mostra tutte le query eseguite al caricamento della pagina, la loro EXPLAIN, il tempo impiegato per l'esecuzione, ecc.). Si potrebbe anche dare un'occhiata a una domanda per quanto riguarda il profilo di un'installazione django lento qui: How to profile django application with respect to execution time?

Tale questione menziona l'uso di hotshot, che è fatto riferimento anche sul Wiki di Django sotto profiling django.

3

Anche io ho visto questo con particolari modelli nell'Admin Django se i loro tavoli sono molto, molto grandi (diversi milioni di record faranno il trucco) e il motore di tabella è InnoDB di MySQL. Mi ci è voluto un po 'per capire come risolvere i problemi per ottenere il mio admin Django canticchiare di nuovo per le tabelle con record di 100M +. Il problema alla radice si è rivelato essere costose query COUNT(*) al caricamento della pagina e anche query di ricerca mal costruite ogni volta che ho utilizzato uno dei miei search_fields da ModelAdmin.

ho documentato tutte le mie soluzioni qui, in modo che un giorno potrebbe aiutare un compagno di Django-er in difficoltà: http://craiglabenz.me/2013/06/12/how-i-made-django-admin-scale/

+2

Um, si dovrebbe riassumere/dare la soluzione qui nel caso in cui il collegamento si interrompe (di nuovo). – SamB

+1

Questa risposta ha funzionato, bug ricorda che se stai personalizzando 'ModelAdmin', dovresti riscrivere il tuo' get_queryset' perché 'django.admin' usa' _default_manager'. Maggiori informazioni controlla [questo] (http://stackoverflow.com/questions/1545067/django-specify-which-model-manager-django-admin-should-use). – shellbye

0

Se si utilizza Django con MySQL poi c'è un bug in MySQL con inner join ottimizzazione. Se si tenta di utilizzare le chiavi esterne in Admin.list_display, Django genererà query con ordinamento e INNER JOIN che sono estremamente lenti in MySQL.

Ci sono due soluzioni a questo:

  1. Usa django-mysql-fix backend: https://pypi.python.org/pypi/django-mysql-fix

  2. Override get_query_set in AdminChangeList - rimuovere select_related e impostare prefetch_related campi - i dettagli sono nella mia altra risposta qui: https://stackoverflow.com/a/23097385/1178806

-1

Ecco alcuni buoni un nswers riguardanti lenti modificare forme causate da tabelle ForeignKey con molti record Django admin change form load quite slow

quanto riguarda Lista Visualizzazioni: 1) È possibile aggiungere l'opzione list_per_page e mostrare meno risultati:

class EventAdmin(admin.ModelAdmin): 
    list_per_page = 20 

2) o utilizzare select_related():

2,1) Per django < 1.6:

class EventAdmin(admin.ModelAdmin): 
    def queryset(self, request): 
     qs = super(EventAdmin, self).queryset(request) 
     return qs.select_related('foreign_key_field1, foreign_key_field2, etc') 

2.2) per Django> = 1,6:

class EventAdmin(admin.ModelAdmin): 
    def get_queryset(self, request): 
     qs = super(EventAdmin, self).queryset(request) 
     return qs.select_related('foreign_key_field1, foreign_key_field2, etc') 

Naturalmente, sostituire foreign_key_field1, e foreign_key_field2, ecc con i nomi dei campi appropriati.