[英]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.