2011-12-28 6 views
0

to_pythonメソッドを使用して解読されるさまざまなデータベースフィールドがあります。私が抱えている問題は、この特定のモデルの管理セクション(admin.ModelAdminリスト)にアクセスするたびに、ページには時間がかかります。私はリストページのフィールドを解読するためにto_pythonメソッドを必要としません。これは、リストされているフィールドやカラムがまったく暗号化されていないためです。ユーザーが項目をクリックして編集すると、to_pythonメソッドが起動しますが、これは意図した通りです。しかし、リストビューで暗号化されていないフィールドだけが表示されていることを念頭に置いて、リストア中にオブジェクトを復号化しようとすると、to_pythonメソッドを停止するにはどうすればよいですか?また、これはフィルタが実際にゆっくりと動作する原因にもなります。ここでも、暗号化されていないフィールドでのみフィルタリングが行われるため、to_pythonメソッドを実行する必要はありません。データがDBからロードされるたびにto_pythonが呼び出されます

+0

ModelAdminのQuerysetメソッドをオーバーライドして、暗号化されたフィールドの読み込みを遅延させたい場合があります。しかし、それについては完全にはわかりませんが、あなたがそれが好きなら、それがどうなるか教えてください。 –

答えて

5

したがって、少数のフィールドしか表示していなくても、管理者が各行のモデルインスタンス全体を読み込むという問題があります。解決策ではなく、デフォルトの管理者の標準get_query_set方法を使用しての、それはあなたがしたいフィールドを取得するだけにonlyメソッドを使用するように、あなたのModelAdminサブクラスでquerysetメソッドをオーバーライドする必要があります:

class MyModelAdmin(admin.ModelAdmin): 
    list_display = ('foo', 'bar') 

    def queryset(self, request): 
     qs = self.model._default_manager.only('foo', 'bar') 
     ordering = self.get_ordering(request) 
     if ordering: 
      qs = qs.order_by(*ordering) 
     return qs 

(かdefer('my_expensive_field')を使用できますが、これは同じものになります)。

+0

それは素晴らしいです!ありがとうございました。 –

+0

「self.model._default_manager.only」の構文はどこから来たのですか?私はそれをgoogledし、Djangoのドキュメントを検索し、私は "唯一の"への参照を見つけることができませんでしたが、私はこの暗い芸術を教えることについて知らない秘密のDjango社会ですか? :-) –

+0

:-) '_default_manager'は私が知る限りは文書化されていませんが、' only'は標準的なクエリーセットメソッドです:https://docs.djangoproject.com/en/1.3/ref/models/querysets/#を参照してください。ただ –

関連する問題