2013-02-25 13 views
9

Mam istniejący system, w którym zamierzam ograniczyć liczbę powiązanych obiektów wyświetlanych w trybie inline.Limit kwerendy wbudowanego administratora django

Na przykład mam model w administratorze z wbudowanym, który może mieć do tysięcy powiązanych rekordów. Chciałbym wyświetlać tylko najnowsze rekordy (powiedzmy 5K najbardziej nagranych rekordów). (Najlepiej byłoby, gdyby można było dokonać stronicowania poprzez wbudowane rekordy, ale wystarczy ograniczyć je do siebie.) Chcę uniknąć sytuacji, w której strona admin ładuje się z wbudowanymi rekordami 60K, co powoduje awarię przeglądarki i obciąża serwer.

podstawie poniższego SO pytanie, stworzyliśmy następujący fragment: How to limit queryset/the records to view in Django admin site?

class TicketNoteAdmin(models.TabularInline): 
    model = models.TicketNote 
    def queryset(self, request): 
     qs = super(TicketNoteAdmin, self).queryset(request).order_by('-created')[:5000] 
     return qs 

jednak pojawia się „Nie można filtrować zapytania raz kromka została podjęta”. Próbowałem nawet użyć paginatora, ale otrzymałem ten sam błąd.

from django.core.paginator import Paginator 

class TicketNoteAdmin(models.TabularInline): 
    model = models.TicketNote 
    def queryset(self, request): 
     qs = super(TicketNoteAdmin, self).queryset(request).order_by('-created') 
     p = Paginator(qs, 5000) 
     page1 = p.page(1) 
     return page1.object_list 

rozumiem dlaczego ja dostaję ten błąd, ale zastanawiam się, czy jest inne podejście, które pozwoli mi ograniczyć liczbę wyświetlanych obiektów inline. Być może administrator nie został zaprojektowany do pracy z wieloma wbudowanymi obiektami, ale uważa, że ​​musi istnieć sposób ograniczenia zbioru rekordów administracyjnych i zapobieżenia sytuacjom, w których przeglądarka/serwer może ulec awarii z powodu zbyt wielu obiektów wbudowanych. Wszelkie porady są mile widziane. Dziękuję za przeczytanie.

Odpowiedz

10

Spróbuj tego:

from django.forms.models import BaseInlineFormSet 

class TicketNoteFormSet(BaseInlineFormSet): 
    def get_queryset(self) : 
     qs = super(TicketNoteFormSet, self).get_queryset() 
     return qs[:5000] 

class TicketNoteAdmin(models.TabularInline): 
    model = models.TicketNote 
    formset = TicketNoteFormSet 
+1

szyfrowego formset prostu zakłada, że ​​get_queryset powróci do tego samego obiektu QuerySet za każdym razem, i że będzie musiał queryset wyniki DB buforowane. Następnie get_queryset BaseModelFormSet jawnie zapisuje instancję QS samodzielnie. Jeśli zastąpisz tę metodę i nie chcesz tysięcy zapytań db, będziesz musiał zrobić to samo. –

Powiązane problemy