8

私はこの例に従いましたが、うまく機能しますが、管理者にいるときにすべてのオブジェクト (アクティブおよび非アクティブ) が表示されるように例外を設定できるかどうか疑問に思っています。これは簡単かもしれませんが、ドキュメントでその方法を見つけることができません。

今のマネージャーはこんな感じです。

class ShareManager(models.Manager):
    def get_query_set(self):
        return super(ShareManager, self).get_query_set().filter(active=True)
4

1 に答える 1

9

頭に浮かぶいくつかの解決策があります:

  1. ModelAdmin.queryset()を使用して、変更リストに使用するクエリセットを定義します。

  2. モデルに2つのマネージャーをインストールします。管理者が最初に見つけたマネージャーが、デフォルトのマネージャーとして使用されます。

    class SomeThing(models.Model):
       objects = models.Manager()
       shares = ShareManager()
    
  3. カスタムマネージャに、アクティブなものだけを返す新しいメソッドを追加しget_query_set、デフォルトのままにします。

    class ShareManager(models.Manager):
        def get_active_items(self):
            return self.get_query_set().filter(active=True)
    

ファローアップ

あなたの場合の最も適切な解決策は、#1と#2のバリエーションを組み合わせることだと思います。

カスタムマネージャーをobjects誰もがアクセスできるように設定し(これは再利用性の問題で機能するはずです)、モデルにデフォルトマネージャーをインストールしてで使用しますModelAdmin.queryset()

    class SomeThing(models.Model):
       objects = ShareManager()
       admin_objects = models.Manager()

メソッドの例も含めるべきModelAdmin.queryset()だったので、ここにあります。

    def queryset(self, request):
        qs = self.model.admin_objects.get_query_set()
        # TODO: this should be handled by some parameter to the ChangeList.
        # otherwise we might try to *None, which is bad ;)
        ordering = self.ordering or () 
        if ordering:
            qs = qs.order_by(*ordering)
        return qs

プレーンマネージャーのインスタンスであり、未公開のアイテムが含まれている行qs = self.model.admin_objects.get_query_set()が機能していることに注意してください。admin_objects

このquerysetメソッドの残りの実装は、通常はを呼び出すデフォルトのDjangoの実装ですqs = self.model._default_manager.get_query_set()

これで少し問題が解決することを願っています。

于 2010-08-16T07:30:25.270 に答える