2013-02-25 62 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