Django admin Django ModelAdmin queryset覆盖不';行不通

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

我试图覆盖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特别声明,只有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')