2013-02-25 61 views
9

我有一個現有的系統,我正在尋求限制管理內聯中顯示的相關對象的數量。django admin內聯查詢集限制

例如,我有一個管理模型,內聯可以有多達數千個相關記錄。我只想顯示最近的記錄(比如5K最新的記錄)。 (理想情況下,可以通過內聯記錄進行分頁,但僅限於它們對我來說就足夠了。)我想避免管理頁面加載60K內聯記錄的情況,這會導致瀏覽器崩潰並對服務器徵稅。

主要基於以下SO問題,我創建了下面的代碼片段: 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 

不過,我得到一個「無法一次過濾網片已經採取的查詢」。我甚至嘗試使用paginator,但得到相同的錯誤。

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上。如果你重寫這個方法,並且你不需要數千分貝的查詢,你將需要做同樣的事情。 – 2015-05-19 13:23:30