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
答案 0 :(得分:1)
我想我来晚了一点,但这将来可能会对某人有所帮助。
Django强制执行-pk
排序,以确保结果查询集具有确定性-例如,请参见here和here。
如果您确实要禁用它,则可以创建自己的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