django admin内联查询集限制

时间:2013-02-25 18:46:43

标签: django django-forms pagination django-admin inline

我有一个现有系统,我希望限制管理内联中显示的相关对象的数量。

例如,我在管理员中有一个模型,其内联可以包含多达数千个相关记录。我只想显示最近的记录(比如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

但是,我得到一个“切片一旦切片就无法过滤查询”。我甚至尝试使用分页器,但得到了同样的错误。

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

我理解为什么我会收到此错误,但我想知道是否有一种不同的方法可以限制显示的内联对象的数量。也许管理员不是设计用于处理这么多内联对象,但是觉得必须有限制管理内联记录集的方法,并防止因为内联对象太多导致浏览器/服务器崩溃的情况。任何建议都非常感谢。谢谢你的阅读。

1 个答案:

答案 0 :(得分: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