代码之家  ›  专栏  ›  技术社区  ›  knuckfubuck Marty

自定义管理器在站点上筛选对象,但不在管理中?

  •  8
  • knuckfubuck Marty  · 技术社区  · 14 年前

    this example 它工作得很好,但我想知道我是否可以放入一个例外,这样当我在管理所有对象显示(活动和非活动)。这可能很简单,但我在文档中找不到如何做到这一点。

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

    class ShareManager(models.Manager):
        def get_query_set(self):
            return super(ShareManager, self).get_query_set().filter(active=True)
    
    1 回复  |  直到 14 年前
        1
  •  9
  •   Davor Lucic    14 年前

    我们想到了几种解决方案:

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

    2. 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 所以每个人都可以访问它(我认为这可以解决您的可重用性问题),还可以在您的模型上安装defaultmanager并在中使用它 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 它是plain manager的实例,包含未发布的项。

    queryset 方法是Django的默认实现,它通常调用 qs = self.model._default_manager.get_query_set() .

    我希望这能把事情弄清楚一点。