簡體   English   中英

Django - 指定Django管理員應該使用哪個模型管理器

[英]Django - specify which model manager Django admin should use

我為Django模型創建了一個自定義管理器,它返回一個包含objects.all()子集的QuerySet。 我需要將它作為模型的默認管理器,因為我還創建了一個自定義標記,它將從任何模型(由參數指定)檢索內容,並且需要使用指定模型的默認管理器。 一切正常,除了 - Django Admin也使用此特定模型的默認管理器,這意味着並非所有模型實例都出現在管理員中。

Django文檔沒有幫助:

如果您使用自定義管理器對象,請注意第一個管理器Django遇到(按照它們在模型中定義的順序)具有特殊狀態。 Django將類中定義的第一個Manager解釋為“默認”管理器,Django的幾個部分( 盡管不是管理應用程序 )將專門為該模型使用該Manager。 (Django Managers文檔)

管理員不應該使用默認的管理器,但它似乎在我的情況下。 請注意,我還明確添加了默認的Manager objects

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

如何指定管理員應使用哪個Manager?

您可以通過覆蓋ModelAdmin子類中的queryset方法來選擇管理器。

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

更新的代碼:

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可以替換......

由於我們希望objects成為唯一的管理者,因此管理員將在self.Admin.manager使用manager

來自troy.simpson打開的門票https://code.djangoproject.com/ticket/4754

class filterManager(models.Manager):
  def get_query_set(self):
    return super(filterManager, self).get_query_set().filter(name='troy')

class Blah(models.Model):
  name = models.CharField(maxlength=100)
  objects = filterManager()
  class Admin:
    manager = filterManager()

用Django 1.11測試

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM