Django ModelAdmin查询集覆盖不起作用

时间:2011-01-31 20:37:27

标签: django-admin override django-queryset

我正在尝试覆盖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中的注释)

3 个答案:

答案 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的行为。

来自ModelAdmin ordering

  

设置ordering以指定应如何在中排序对象列表   Django管理员观点。这应该是相同格式的列表或元组   作为模型的ordering参数。 [...] Django尊重列表/元组中的所有元素;在1.4之前,只有第一个受到尊重。

在半相关的注释上 - 如果您覆盖queryset以提供自定义排序顺序,Changelist似乎将覆盖该排序顺序。它应用ordering参数中的任何排序,如果没有,则按pk应用默认排序,从而否定您在queryset中所做的任何排序。

认为它应该有用 - 至少这个Django Ticket已修复。但是我几天前只是尝试使用queryset来应用自定义排序,但它对我来说根本不起作用。甚至在单个字段上排序,似乎在最终视图中被覆盖。所以要么我做错了什么,要么就是没有修好。 :)

请注意, 可以通过代码进行自定义排序,但您必须继承Changelist,并按this snippet覆盖其get_query_set()方法}。 (虽然这有点矫枉过正,如果您只需要对多个字段进行排序,那么Django 1.4现在支持多个字段)。