頭に浮かぶいくつかの解決策があります:
ModelAdmin.queryset()を使用して、変更リストに使用するクエリセットを定義します。
モデルに2つのマネージャーをインストールします。管理者が最初に見つけたマネージャーが、デフォルトのマネージャーとして使用されます。
class SomeThing(models.Model):
objects = models.Manager()
shares = ShareManager()
カスタムマネージャに、アクティブなものだけを返す新しいメソッドを追加し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()
。
これで少し問題が解決することを願っています。