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 个管理器,管理员找到的第一个将用作默认的 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)
    

跟进

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