我按照这个示例进行操作,效果很好,但我想知道是否可以设置一个异常,以便当我在管理员中时所有对象都显示出来(活动和非活动)。这可能很简单,但我在文档中找不到如何操作。
这是我的经理现在的样子:
class ShareManager(models.Manager):
def get_query_set(self):
return super(ShareManager, self).get_query_set().filter(active=True)
我按照这个示例进行操作,效果很好,但我想知道是否可以设置一个异常,以便当我在管理员中时所有对象都显示出来(活动和非活动)。这可能很简单,但我在文档中找不到如何操作。
这是我的经理现在的样子:
class ShareManager(models.Manager):
def get_query_set(self):
return super(ShareManager, self).get_query_set().filter(active=True)
想到了几种解决方案:
使用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()
.
我希望这能澄清一点。