自定义管理器来过滤现场但不在管理员中的对象?

时间:2010-08-16 00:25:21

标签: django django-models django-managers

我跟着this example并且效果很好但是我想知道我是否可以放入异常,以便当我在管理员中时所有对象都显示出来(活动和非活动)。这可能很简单,但我无法在文档中找到如何做到这一点。

以下是我的经理现在的样子:

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

1 个答案:

答案 0 :(得分:9)

有几种解决方案可以想到:

  1. 使用ModelAdmin.queryset()定义用于更改列表的查询集。

  2. 在您的模型上安装2个管理员,管理员找到的第一个管理员将用作默认的AFAIK。

    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)
    
  4. <强>后续

    我认为在你的情况下最合适的解决方案是结合#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()

    我希望这可以解决一些问题。