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