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

Chr*_*lor 37 python django

我为Django模型创建了一个自定义管理器,它返回一个包含objects.all()子集的QuerySet.我需要这是模型的默认经理,因为我还创建自定义的标签,这将可以从任何模型(由自变量指定)的内容,并且需要使用默认经理指定的模型.一切正常,除了 - Django Admin也使用此特定模型的默认管理器,这意味着并非所有模型实例都出现在管理员中.

Django文档没有帮助:

如果您使用自定义管理器对象,请注意第一个管理器Django遇到(按照它们在模型中定义的顺序)具有特殊状态.Django将类中定义的第一个Manager解释为"默认"管理器,Django的几个部分(尽管不是管理应用程序)将专门为该模型使用该Manager. (Django Managers文档)

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

subset = CustomManager() # the default manager
objects = models.Manager() # the one I want admin to use
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*man 50

您可以通过覆盖querysetModelAdmin子类中的方法来选择管理器.

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
Run Code Online (Sandbox Code Playgroud)

  • 他们在Django 1.6中将方法重命名为`get_queryset`.旧名称现在[已弃用](https://docs.djangoproject.com/en/1.6/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_queryset). (3认同)

Ale*_*kov 8

更新的代码:

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
Run Code Online (Sandbox Code Playgroud)

_default_manager可以替换......


Kar*_*ūtė 5

您定义经理的顺序很重要。管理员采用模型上定义的第一个经理。

所以如果你这样做:

subset = CustomManager() # the default manager
objects = models.Manager() # the one I want admin to use
Run Code Online (Sandbox Code Playgroud)

默认管理器将是subset

如果你这样做:

objects = models.Manager() # the default manager
subset = CustomManager() # your own manager
Run Code Online (Sandbox Code Playgroud)

那么默认管理器将是objects.