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

をしかし、私は「スライスが取られた後、クエリをフィルタリングすることはできません」を取得。私もページャーを使ってみましたが、同じエラーが出ます。私はこのエラーを取得していますが、私は表示されたインラインオブジェクトの数を制限することができるようになる異なるアプローチがあるかどうか疑問に思って、なぜ私が理解

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

フォームセットのコードは、ちょうどget_querysetが同じクエリセットオブジェクトを毎回返すと、そのクエリセットは、DBの結果がキャッシュされなければならないことになることを想定しています。その後、BaseModelFormSetのget_querysetは、QSインスタンスをselfに明示的に保存します。そのメソッドをオーバーライドし、何千ものdbクエリーを必要としない場合、同じことをする必要があります。 –