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

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

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

但现在我希望在 name 字段上启用排序,但不是按 name 排序,我希望它按 natname 排序。这可能吗?

因此,即使 natname 是一个额外的字段,我还是想在排序时以某种方式将 name 列与 natname 绑定(bind)。

现在,如果我执行 qs.query.__str__() ,我会使用 order by natname 获得 sql 查询。当我单击 name 列时,按对 name 的更改排序,但仅针对这种特殊情况,我希望它按 natname 排序。这可能吗?

我已经查看了 Django 如何在 <django-installation-path>/contrib/admin 下为这些自动管理页面生成标题和 View ,但它只引用了在该模型的 list_display 中定义的 ModelAdmin 集。如果我在那里进行任何更改,显示的列会在管理 View 中更改。

听起来可能有点困惑。如果您需要特定的细节,请随时询问。

谢谢。

最佳答案

是的!这是可能的(至少在 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)

关于Django 管理页面 : Can queryset extra fields be used for sorting specific columns,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4890844/

10-10 13:08