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

knu*_*uck 8 django django-models django-managers

我跟着这个例子,它的伟大工程,但我想知道如果我可以把一个例外,这样,当我在管理中的所有对象显示(有效和无效).这可能很简单,但我无法在文档中找到如何做到这一点.

这是我的经理现在的样子:

class ShareManager(models.Manager):
    def get_query_set(self):
        return super(ShareManager, self).get_query_set().filter(active=True)
Run Code Online (Sandbox Code Playgroud)

Dav*_*cic 9

我想到了几种解决方案:

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

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

    class SomeThing(models.Model):
       objects = models.Manager()
       shares = ShareManager()
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在自定义管理器上添加新方法,该方法仅返回活动内容并get_query_set默认保留.

    class ShareManager(models.Manager):
        def get_active_items(self):
            return self.get_query_set().filter(active=True)
    
    Run Code Online (Sandbox Code Playgroud)

跟进

我认为在你的情况下最合适的解决方案是结合#1和#2的变体.

设置自定义的经理为objects使每个人都可以访问它(我想这应该为你的可重用性问题的工作),并在模型上安装默认管理和使用它ModelAdmin.queryset().

    class SomeThing(models.Model):
       objects = ShareManager()
       admin_objects = models.Manager()
Run Code Online (Sandbox Code Playgroud)

我也应该包含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
Run Code Online (Sandbox Code Playgroud)

注意该行qs = self.model.admin_objects.get_query_set()正在使用admin_objects 普通管理器的实例,包括未发布的项目.

这个queryset方法实现的其余部分是默认的Django实现,通常调用qs = self.model._default_manager.get_query_set().

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