Django admin Django ModelAdmin queryset覆盖不';行不通
我试图覆盖ModelAdmin类的queryset(),以便admin中显示的对象列表将按两个级别进行排序 我尝试了下面的代码,但它不起作用,即表没有按预期排序Django admin Django ModelAdmin queryset覆盖不';行不通,django-admin,overriding,django-queryset,Django Admin,Overriding,Django Queryset,我试图覆盖ModelAdmin类的queryset(),以便admin中显示的对象列表将按两个级别进行排序 我尝试了下面的代码,但它不起作用,即表没有按预期排序 class ProductAdmin(admin.ModelAdmin): def queryset(self, request): qs = super(ProductAdmin, self).queryset(request) return qs.order_by('category','ma
class ProductAdmin(admin.ModelAdmin):
def queryset(self, request):
qs = super(ProductAdmin, self).queryset(request)
return qs.order_by('category','market')
list_display = ('category', 'market', 'name', 'quantity')
admin.site.register(Product, ProductAdmin)
顺便说一句,您不能使用
ordering=('category','market')
,因为django特别声明,只有ordering元组中的第一项生效(请参见文档中的注释)我正好遇到了这个问题。以下是我所做的:
我将ChangeList
分为子类,并覆盖ChangeList。获取查询集
以重做之前由ChangeList更改的正确顺序。获取排序
:
这就是我在本例中所做的(我使用的是django easytree,但django mptt也是如此):
此外,请检查这些车票:
- 对于Django 1.4来说,Django现在在管理界面中支持
多重排序
:
管理员更改列表现在支持对多列进行排序。信息技术
尊重ordering属性的所有元素,并在
点击标题的多列是为了模仿
桌面GUI的行为
和来自:
设置排序
以指定对象列表在
Django管理视图。这应该是相同格式的列表或元组
作为模型的排序
参数。[…]Django尊重列表/元组中的所有元素;在1.4之前,只有第一个得到尊重
在半相关注释中-如果您确实覆盖queryset
以提供自定义排序顺序,则Changelist
似乎将覆盖该排序顺序。它应用在排序
参数中找到的任何排序,如果没有,则应用默认的排序方式pk
,从而否定您在查询集
中执行的任何排序
我认为它应该是有效的-至少这是固定的。但是几天前,我刚刚尝试使用queryset
应用一个自定义排序,它对我来说根本不起作用。即使在单个字段上排序,在最终视图中也似乎被覆盖。所以要么我做错了什么,要么就没那么好了。:)
请注意,可以通过代码进行自定义排序,但您必须子类化
Changelist
,并重写其get\u query\u set()
方法,如所示。(虽然这有点过分,但如果您只需要对多个字段进行排序,因为Django 1.4现在支持多个字段)。get\u queryset
在Django 1.8中工作。哇,这是一张3年前仍标记为“new”的罚单。对我来说似乎是一个设计缺陷…@Jonathan:同意,这是一个非常令人沮丧的缺陷。
class MyChangeList(ChangeList):
def get_query_set(self):
qs = super(MyChangeList, self).get_query_set()
return qs.order_by('tree_id', 'lft')