在我的数据库模型中,我有姓和名.在django-admin站点中,我想显示"LASTNAME,FIRSTNAME",并使该列可排序.为此,我在我的admin.ModelAdmin班级中使用了@admin.display个decorator .

此修饰符接受ordering参数,该参数可以是字符串,引用要排序的模型字段名,例如:

    @admin.display(description = "Full name", ordering = "last_name")
    def full_name(self, obj):
        return f"{obj.last_name}, {obj.first_name}"

然而,显然,这只能按last_name进行排序,因此,姓氏相同的人将以任意顺序结束.我试过了:

@admin.display(description = "Full name", ordering = ["last_name", "first_name"])

或者使用列表而不是元组,但这失败了("‘tuple’对象没有‘startswith’属性").

我搜索了一下,发现我的问题在这里没有得到确切的回答:https://forum.djangoproject.com/t/how-to-tell-admin-display-decorator-to-order-the-results-by-two-columns/21418也在这篇文章中:Django-admin order by multiple fields有人建议直观的列表语法可以与"排序"一起使用,但这似乎不适用于装饰符.

推荐答案

不幸的是,这确实不起作用,我前段时间try 了同样的方法,发现它没有实现(以这种方式).但是对于这个特定的例子,您可以使用Concat [Django-doc]来重现这个行为,将两个字段连接在一起并生成一个字符串,就像在函数体中一样:

from django.db.models import Value
from django.db.models.functions import Concat


@admin.display(
    description='Full name',
    ordering=Concat('last_name', Value(','), 'first_name'),
)
def full_name(self, obj):
    return f'{obj.last_name}, {obj.first_name}'

Django相关问答推荐

未显示SWAGER上的一些示例架构

如何根据递归ManyToManyField值创建Django查询集?

Django/SendGrid-密码重置-发件人地址与验证的发件人身份不匹配.";

Django没有显示变量

如何创建复杂的查询?| ChartJS 和 Django

在 Django 中重组多对多字段

当从 fastapi 发送请求时,Django 无法对 Postgres 执行查询

遍历django模板中的外键相关表

将计数字段添加到 django rest 框架序列化程序

使用移动应用程序保护通信 [真实性、隐私和完整性]?

在 Django 过滤器语句中,__exact 和等号 (=) 有什么区别?

Django - 如何在其管理模块中访问模型的详细名称?

relation "django_site" does not exist

将 XML 从 URL 解析为 python 对象

Django UrlResolver,在运行时添加 url 进行测试

django admin 排序外键字段列表

Django 模型方法 - create_or_update

如何在 django 2.0 admin 中使用 allow_tags?

Django Debug Toolbar:了解时间面板( time panel)

使用 .order_by() 和 .latest() 的 Django 查询