2015-07-16 10 views
5

(Django 1.8) Ho una tabella che ha 4 relazioni molti-a-molti con altre tabelle. Due di queste tabelle hanno così tante voci e questo sta causando un caricamento molto lento della pagina di amministrazione perché sta tentando di caricare tutte le voci negli elenchi. Esiste un modo per evitare la query della pagina di amministrazione interna per il caricamento di tutte le voci delle tabelle di grandi dimensioni per accelerare il caricamento della pagina di amministrazione? Penso che il modo migliore sia quello di elencare solo i valori selezionati, ma non sono sicuro di come.Django - Caricamento della pagina di amministrazione della relazione molti-a-molti è così lento

Non sono sicuro di come utilizzare limit_choices_to qui:

class Data(models.Model): 
    pass # stuff here 

class Report(models.Model): 
    data= models.ManyToManyField(Data) 

Ho anche provato ad aggiungere questo al mio admin.py ma non ha aiutato affatto. Non è limitante per qualche motivo:

def queryset(self, request): 
    qs = super(MyModelAdmin, self).queryset(request) 
    if len(qs) > 10: 
     qs = qs[:10] 
    return qs 

risposta

7

Se si vuole ancora utilizzare limit_choices_to, quindi si prega di fare riferimento al docs. In pratica si limitano a fornire i filtri in un oggetto dizionario.

Per velocizzare l'amministrazione, i miei suggerimenti includono:
1. Utilizzo di raw_id_fields in ModelAdmin. Questo ti dà una piccola casella di ricerca invece di una selectbox ed evita il sovraccarico di elencare tutti gli oggetti correlati.
2. Se si gestiscono le relazioni ForeignKey in avanti, è possibile utilizzare anche list_select_related in ModelAdmin. Nel tuo caso, stai gestendo relazioni molti-a-molti, quindi puoi provare a sovrascrivere il metodo get_queryset di ModelAdmin e utilizzare prefetch_related come nel codice qui sotto.

from django.contrib import admin 

class TestModelAdmin(admin.ModelAdmin): 
    def get_queryset(self, request): 
     test_model_qs = super(TestModelAdmin, self).get_queryset(request) 
     test_model_qs = test_model_qs.prefetch_related('many-to-many-field') 
     return test_model_qs 

Se vi piace davvero mettere le mani sporche, consiglio vivamente di usare django-debug-toolbar. Ti dà davvero visibilità su quante e quali istruzioni SQL vengono eseguite. Se è possibile leggere SQL, è possibile dedurre ciò che è necessario immettere in select_related e prefetch_related.

+0

raw_id_fields è ciò di cui avevo bisogno. Grazie. – max

Problemi correlati