代码之家  ›  专栏  ›  技术社区  ›  Chris Lawlor

Django-指定Django管理员应该使用哪个模型管理器

  •  44
  • Chris Lawlor  · 技术社区  · 16 年前

    我为Django模型创建了一个自定义管理器,它返回一个包含objects.all()子集的QuerySet。我需要它作为模型的默认管理器,因为我还在创建一个自定义标记,该标记将从任何模型(由参数指定)中检索内容,并且需要为指定的模型使用默认管理器。所有这些都很好,除了Django Admin也使用了这个特定模型的默认管理器,这意味着并非所有模型实例都出现在管理员中。

    如果你使用自定义的Manager对象,请注意Django遇到的第一个Manager(in 虽然不是管理应用程序 )将专门为该型号使用该管理器。 (Django Managers documentation)

    管理员不应该使用默认的管理器,但在我的情况下似乎是这样。请注意,我还明确添加了默认管理器 objects :

    subset = CustomManager() # the default manager
    objects = models.Manager() # the one I want admin to use
    

    我如何指定管理员应使用哪个管理器?

    4 回复  |  直到 16 年前
        1
  •  46
  •   andilabs    9 年前

    queryset ModelAdmin子类中的方法。

    def get_queryset(self, request):
        # use our manager, rather than the default one
        qs = self.model.objects.get_queryset()
    
        # we need this from the superclass method
        ordering = self.ordering or () # otherwise we might try to *None, which is bad ;)
        if ordering:
            qs = qs.order_by(*ordering)
        return qs
    
        2
  •  6
  •   Alexander Ovchinnikov    13 年前

    def get_queryset(self, request):
        """
        Returns a QuerySet of all model instances that can be edited by the
        admin site. This is used by changelist_view.
        """
        qs = self.model._default_manager.get_queryset()
        # TODO: this should be handled by some parameter to the ChangeList.
        ordering = self.get_ordering(request)
        if ordering:
            qs = qs.order_by(*ordering)
        return qs
    

    _default_manager可以替换。..

        3
  •  1
  •   Victor T    9 年前

    你定义经理的顺序很重要。管理员获取模型上定义的第一个管理员。

    所以,如果你喜欢这样:

    subset = CustomManager() # the default manager
    objects = models.Manager() # the one I want admin to use
    

    默认管理器将是 subset

    objects = models.Manager() # the default manager
    subset = CustomManager() # your own manager
    

    objects .