我正在尝试覆盖ModelAdmin类的queryset(),以便admin中显示的对象列表按排序两级。
我已尝试过以下代码,但它不起作用,即表未按预期排序
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明确指出只有排序元组中的第一项生效(参见文档here中的注释)
答案 0 :(得分:7)
get_queryset
适用于Django 1.8。
答案 1 :(得分:3)
我有这个问题。这是我做的:
我将[{1}}子类化并覆盖ChangeList
以重做之前由ChangeList.get_query_set
更改的正确order_by:
这就是我在我的案例中所做的(我使用的是django-easytree,但同样适用于django-mptt):
ChangeList.get_ordering
另外,请查看这些门票:
答案 2 :(得分:1)
Django 1.4的release notes表示Django现在支持Multiple sort in admin interface
:
管理员更改列表现在支持对多列进行排序。它 尊重排序属性的所有元素,并进行排序 通过单击标题来设置多个列是为了模仿 桌面GUI的行为。
设置
ordering
以指定应如何在中排序对象列表 Django管理员观点。这应该是相同格式的列表或元组 作为模型的ordering
参数。 [...] Django尊重列表/元组中的所有元素;在1.4之前,只有第一个受到尊重。
在半相关的注释上 - 如果您覆盖queryset
以提供自定义排序顺序,Changelist
似乎将覆盖该排序顺序。它应用ordering
参数中的任何排序,如果没有,则按pk
应用默认排序,从而否定您在queryset
中所做的任何排序。
我认为它应该有用 - 至少这个Django Ticket说已修复。但是我几天前只是尝试使用queryset
来应用自定义排序,但它对我来说根本不起作用。甚至在单个字段上排序,似乎在最终视图中被覆盖。所以要么我做错了什么,要么就是没有修好。 :)
请注意, 可以通过代码进行自定义排序,但您必须继承Changelist
,并按this snippet覆盖其get_query_set()
方法}。 (虽然这有点矫枉过正,如果您只需要对多个字段进行排序,那么Django 1.4现在支持多个字段)。