我跟着this example并且效果很好但是我想知道我是否可以放入异常,以便当我在管理员中时所有对象都显示出来(活动和非活动)。这可能很简单,但我无法在文档中找到如何做到这一点。
以下是我的经理现在的样子:
class ShareManager(models.Manager):
def get_query_set(self):
return super(ShareManager, self).get_query_set().filter(active=True)
答案 0 :(得分:9)
有几种解决方案可以想到:
使用ModelAdmin.queryset()定义用于更改列表的查询集。
在您的模型上安装2个管理员,管理员找到的第一个管理员将用作默认的AFAIK。
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()
。
我希望这可以解决一些问题。