Django管理页面:queryset额外字段能否用于对特定列进行排序
因此,queryset中的额外字段可用于向select查询添加额外的列,而select查询又可设置为默认顺序。到目前为止,我已经能够做到这一点:创建一个额外的字段,然后将其设置为默认顺序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排序…完美
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 toname
,但仅针对这种特殊情况,我希望它按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
对其进行排序。检查下面。