2015-07-16 17 views
5

(Django 1.8) Ich habe eine Tabelle, die 4 viele-zu-viele Beziehung zu anderen Tabellen hat. Zwei dieser Tabellen enthalten so viele Einträge, dass die Verwaltungsseite sehr langsam geladen wird, da versucht wird, alle Einträge in den Listen zu laden. Gibt es eine Möglichkeit, die interne Admin-Seite Abfrage zum Laden aller Einträge der großen Tabellen zu vermeiden, um die Admin-Seite laden zu beschleunigen? Ich denke, der beste Weg ist, nur die ausgewählten Werte aufzulisten, aber ich bin mir nicht sicher, wie.Django - Laden Viele-zu-Viele Beziehung Admin-Seite ist so langsam

Ich bin nicht sicher, wie hier limit_choices_to zu verwenden:

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

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

Ich habe auch versucht, diese zu meinen admin.py aber es hat nicht helfen. Es ist nicht aus irgendeinem Grund zu beschränken:

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

Antwort

7

Wenn Sie noch limit_choices_to verwenden möchten, dann finden Sie in der docs. Sie liefern grundsätzlich nur die Filter in einem Dictionary-Objekt.

Um den Admin zu beschleunigen, sind meine Vorschläge:
1. Verwenden raw_id_fields in Ihrem ModelAdmin. Dies gibt Ihnen ein kleines Suchfeld anstelle einer Auswahlbox und vermeidet den Overhead der Auflistung aller verwandten Objekte.
2. Wenn Sie Forward ForeignKey-Beziehungen bearbeiten, können Sie auch list_select_related in Ihrem ModelAdmin verwenden. In Ihrem Fall behandeln Sie viele-zu-viele-Beziehungen. Sie können also versuchen, die Methode get_queryset von ModelAdmin zu überschreiben und prefetch_related wie im folgenden Code zu verwenden.

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 

Wenn Sie wirklich Ihre Hände schmutzig lernen, empfehle ich Ihnen django-debug-toolbar verwenden. Es gibt Ihnen einen Überblick darüber, wie viele und welche SQL-Anweisungen ausgeführt werden. Wenn Sie SQL lesen können, können Sie ableiten, was Sie in select_related und prefetch_related eingeben müssen.

+0

raw_id_fields ist was ich brauchte. Vielen Dank. – max