2015-07-16 33 views
5

(Django 1.8) Mam tabelę, która ma 4 relacje wiele do wielu z innymi tabelami. Dwie z tych tabel mają tak wiele pozycji, a to powoduje, że strona admin ładuje się bardzo powoli, ponieważ próbuje załadować wszystkie wpisy na listach. Czy istnieje sposób na uniknięcie zapytania wewnętrznego strony administracyjnej o załadowanie wszystkich wpisów w dużych tabelach, aby przyspieszyć ładowanie strony administratora? Myślę, że najlepszym sposobem jest tylko lista wybranych wartości, ale nie jestem pewien jak.Django - ładowanie strony administratora relacji wiele do wielu jest tak powolne

Nie jestem pewny jak używać limit_choices_to tu:

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

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

Próbowałem też dodanie tego do mojego admin.py ale to nie pomaga w ogóle. To nie jest ograniczenie z jakiegoś powodu:

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

Odpowiedz

7

Jeśli nadal chcesz używać limit_choices_to, należy zapoznać się z docs. Po prostu dostarczasz filtry w obiekcie słownika.

Aby przyspieszyć pracę administratora, moje sugestie obejmują:
1. Korzystanie z raw_id_fields w swoim ModelAdmin. To daje ci małe pole wyszukiwania zamiast pola wyboru i pozwala uniknąć narzutu na wyświetlanie wszystkich powiązanych obiektów.
2. Jeśli korzystasz z relacji ForeignKey w przód, możesz również użyć list_select_related w swoim ModelAdmin. W twoim przypadku radzisz sobie z wieloma relacjami, więc możesz spróbować przesłonić metodę get_queryset ModelAdmin i użyć prefetch_related jak w poniższym kodzie.

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 

Jeśli naprawdę podoba się ubrudzić sobie ręce, bardzo polecam użyć django-debug-toolbar. To naprawdę daje wgląd w to, ile i jakie instrukcje SQL są uruchamiane. Jeśli potrafisz czytać SQL, możesz wywnioskować, co musisz wprowadzić do select_related i prefetch_related.

+0

raw_id_fields jest tym, czego potrzebowałem. Dzięki. – max