Django管理页面:queryset额外字段能否用于对特定列进行排序

Django管理页面:queryset额外字段能否用于对特定列进行排序,django,sql-order-by,admin,django-queryset,extra,Django,Sql Order By,Admin,Django Queryset,Extra,因此,queryset中的额外字段可用于向select查询添加额外的列,而select查询又可设置为默认顺序。到目前为止,我已经能够做到这一点:创建一个额外的字段,然后将其设置为默认顺序 qs = qs.extra(select={'natname':"concat('0', nat, name)"}, order_by=['natname']) 现在,在我的管理界面中,我有我的其他字段{name,nat,location,space,…},当页面加载时,表中的结果按natname排序…完美

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

qs = qs.extra(select={'natname':"concat('0', nat, name)"}, order_by=['natname'])
现在,在我的管理界面中,我有我的其他字段
{name,nat,location,space,…}
,当页面加载时,表中的结果按
natname
排序…完美

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

因此,尽管
natname
是一个额外的字段,但在排序时,我想以某种方式将列
name
natname
绑定

现在,如果我执行
qs.query.\uu str\uuu()
,我将使用
order by natname
获得sql查询。当我点击列
name
,order by changes to
name
,但仅针对这种特殊情况,我希望它按
natname
排序。这可能吗

我已经了解了Django如何在
/contrib/admin
下为这些自动管理页面生成标题和视图,但它只引用了在该模型的
ModelAdmin
中定义的
list\u display
集。如果我在那里做了任何更改,显示的列将在管理视图中更改

听起来可能有点混乱。如果您需要详细信息,请随时询问

谢谢。

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

我认为这行不通,因为
ChangeList.get\u ordering
首先查找有效的模型字段。如果字段查找失败(在本例中不会),它只搜索
ModelAdmin
admin\u order\u字段
。@Yuji:thx以获取洞察!一旦我尝试,我会将这篇文章标记为删除。我看了来源,我的直觉是你是对的。Boo确实:(@Yuji:我更改了我的答案。我们可以haz答案!请参见上文。Thx再次。@mkelley33,不错的一个!我喜欢它。功能与映射字段相同。我到底在做什么?我在挖掘变更列表…@Yuji:哈哈,显然你在保护我和其他人不传播/消费错误信息。我很高兴我能够纠正自己!Thx挖掘:)我对
ChangeList
进行了子类化,以覆盖
get\u ordering
方法,从
FIELD\u MAP
字典中将一个字段的顺序转换为另一个字段的顺序,但它只在一个方向上运行。我现在遇到的麻烦是获取
django.contrib.admin.templatetags.admin\u list.result\u headers
以呈现相反的结果ite方向(
desc/asc
)链接。
result\u headers
检查
cl.order\u字段
,该字段现在已被覆盖为
natname
,因此从未找到与.Boo反向排序匹配的字段。如果找到解决方案,请告诉我;)@Shuvo:查看我的修订版,工作答案如下。@Yuji:我现在也在做类似的事情。我会给mkelly33的剧本一次机会。谢谢你们!大量的帮助。谢谢。@Shuvo是的,mkelley33的更新答案是win按钮。在功能上等同于任何其他潜在的解决方案,当然更容易。@Yuji:绝对……只有当
natname
可以显示时。但他们希望显示
name
,并希望仅通过引用
natname
对其进行排序。检查下面。