如何在Django Admin中禁用主键排序?

时间:2016-09-27 10:28:57

标签: python mysql django sorting

Django管理员除了在模型“排序”记录中指定的排序字段外,还按主键排序,因此,必须在模型上使用复合索引才能进行排序,这可以是对适量数据(约5 000 000条记录)非常禁止

这是Django Admin选择查询

的默认行为
SELECT * FROM `book` ORDER BY `book`.`added_at` ASC, `book`.`book_id` DESC LIMIT 100

我想实现以下行为

 SELECT * FROM `book` ORDER BY `book`.`added_at` ASC LIMIT 100

1 个答案:

答案 0 :(得分:1)

我想我来晚了一点,但这将来可能会对某人有所帮助。

Django强制执行-pk排序,以确保结果查询集具有确定性-例如,请参见herehere

如果您确实要禁用它,则可以创建自己的ChangeList子类并覆盖get_ordering方法,例如:

from django.contrib import admin
from django.contrib.admin.views.main import ChangeList

class NoPkDescOrderedChangeList(ChangeList):
    def get_ordering(self, request, queryset):
        rv = super().get_ordering(request, queryset)
        rv = list(rv)
        rv.remove('-pk') if '-pk' in rv else None
        return tuple(rv)

class YourExistingAdmin(admin.ModelAdmin):
    def get_changelist(self, request):
        return NoPkDescOrderedChangeList