Django管理页面:可以使用查询集额外字段来排序特定列

Shu*_*uvo 4 django admin sql-order-by django-queryset extra

因此,查询集中的额外字段可用于向选择查询添加其他列,而后者又可以设置为默认排序.到目前为止,我已经能够实现这一点:创建了一个额外的字段,然后将其设置为默认排序.

qs = qs.extra(select={'natname':"concat('0', nat, name)"}, order_by=['natname'])
Run Code Online (Sandbox Code Playgroud)

现在,在我的管理界面中,我有其他字段{name, nat, location, space, ....},表格中的结果按natname页面加载时排序...完美.

但是现在我想在name现场进行排序,但不是按顺序排序name,我希望它按顺序排序natname.这可能吗?

所以即使natname是一个额外的字段,我想以某种方式绑定列namenatname订购时.

现在,如果我这样做qs.query.__str__(),我会得到sql查询order by natname.当我点击列时name,按更改顺序排序name,但仅针对此特殊情况,我希望它按顺序排序natname.这可能吗?

我已经了解了Django如何为这些自动化管理页面生成标题和视图,<django-installation-path>/contrib/admin但它只引用了此模型中list_display定义的集合ModelAdmin.如果我在那里进行任何更改,则显示的列将在admin-view中更改.

听起来有点令人困惑.如果您需要特殊细节,请随时询问.

谢谢.

mke*_*y33 6

是! 这是可能的(至少在Django 1.2.3中):

在您的admin.ModelAdmin子类中:

from django.contrib import admin

from .models import ClassA

class ModelAdminA(admin.ModelAdmin):
    list_display = ('natname',)

    def natname(self, obj):
        return obj.name
    natname.admin_order_field = 'natname'
    natname.short_description = 'name'

    def queryset(self, request):
        qs = super(ModelAdminA, self).queryset(request)
        qs = qs.extra(select={ 'natname': "concat('0', nat, name)" })
        return qs

admin.site.register(ClassA, ModelAdminA)
Run Code Online (Sandbox Code Playgroud)