2013-02-25 2 views
9

관리자 인라인에 표시되는 관련 객체 수를 제한하려는 기존 시스템이 있습니다.django admin 인라인 queryset 제한

예를 들어 관리자에게 수천 개의 관련 레코드를 가질 수있는 인라인이있는 모델이 있습니다. 가장 최근의 레코드 만 표시하고 싶습니다 (5K 대부분의 재전송 레코드). (이상적으로는 인라인 레코드를 통해 페이지 매김을 할 수 있지만 그 레코드를 제한하는 것만으로 충분할 것입니다.) 관리자 페이지에 60K 인라인 레코드가로드되어 브라우저가 충돌하고 서버에 세금이 부과되는 상황을 피하고자합니다. 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 

그러나, 내가이 "한 번 슬라이스 촬영 된 쿼리를 필터링 할 수 없습니다"얻을 다음 SO 다음과 같은 질문을 바탕으로

, 나는 다음 코드를 만들었습니다. 심지어 페이 지 네이터를 사용해 보았지만 동일한 오류가 발생했습니다. 나는이 오류를 얻고있다, 그러나 저를 표시 인라인 개체의 수를 제한 할 수 있습니다 할 다른 방법이 있는지 궁금 이유를 이해

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 

. 아마도 관리자는이 많은 인라인 객체를 사용하도록 설계되지 않았지만 관리자 인라인 레코드 세트를 제한하고 브라우저/서버가 너무 많은 인라인 객체로 인해 충돌 할 수있는 상황을 방지해야한다고 생각합니다. 어떤 조언을 많이 주시면 감사하겠습니다. 읽어 주셔서 감사합니다.

답변

10

이 시도 :

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

의 formset 코드는 get_queryset가 동일한 검색어 세트 개체마다가 반환하고의 검색어가 DB 결과를 캐시 것으로 가정합니다. 이후 BaseModelFormSet의 get_queryset은 QS 인스턴스를 명시 적으로 self에 저장합니다. 이 방법을 재정의하고 수천 개의 db 쿼리를 원하지 않으면 동일한 작업을 수행해야합니다. –