我在整个项目中使用自定义抽象模型和经理。
class BaseQueryset(models.QuerySet):
pass
class BaseManager(models.Manager):
queryset_class = BaseQueryset
def get_queryset(self, exclude_no_published=True):
""" exclude all objects with is_published=False by default """
q = self.queryset_class(self.model)
if exclude_no_published:
q = q.exclude(is_published=False)
return q
def all_objects(self):
""" allows geting all objects in admin """
return self.get_queryset(exclude_no_published=False)
class BaseAbstractModel(models.Model):
is_published = models.BooleanField(default=True)
objects = BaseManager()
class Meta:
abstract = True
所有模型都继承自这个抽象模型,我需要一种方法来表示admin中的所有对象。所以我使用get_queryset
方法
class AdminFullQuerysetMixin(object):
def get_queryset(self, request):
"""
Allows showing all objects despite on is_public=False
"""
qs = self.model.objects.all_objects()
ordering = self.get_ordering(request)
if ordering:
qs = qs.order_by(*ordering)
return qs
我有一个典型的管理类:
@admin.register(SomeModel)
class SomeModelAdmin(AdminFullQuerysetMixin, admin.ModelAdmin):
list_display = ('name', 'slug', 'is_published')
list_filter = ('is_published',)
list_editable = ('is_published',)
一切正常,我可以看到管理员中的所有对象是否为is_published
False或True。但是当我在管理对象列表页面中使用它时,list_filter
或list_editable
等属性不起作用。没有例外,只是列表顶部的文字:“请更正下面的错误”
我应该覆盖除get_queryset
以外的哪些方法来解决我的问题?
答案 0 :(得分:1)
您可能需要read this:
如果使用自定义Manager对象,请注意第一个Manager Django遇到(按照模型中定义的顺序) 有特殊的地位。 Django解释了a中定义的第一个Manager class作为“默认”管理器,以及Django(...)的几个部分 将该Manager专门用于该模型。结果,它是一个 最好小心选择默认管理器 避免重写get_queryset()导致的情况 无法检索您想要使用的对象。
我强烈怀疑你遇到其中一个案件......
然后解决方案是将您的模型更改为:
class BaseAbstractModel(models.Model):
is_published = models.BooleanField(default=True)
# this one will be the default manager
all_objects = models.Manager()
# and this one will be known as 'objects'
objects = BaseManager()
class Meta:
abstract = True
然后你可以删除你的AdminFullQuerysetMixin(或者重写它的get_queryset()
方法来代替使用self.model._default_manager
)
注意:我当然可能错了,问题完全无关;)