Django 管理员:自定义排序

Posted

技术标签:

【中文标题】Django 管理员:自定义排序【英文标题】:Django admin: Custom ordering 【发布时间】:2016-12-05 19:52:12 【问题描述】:

我有一个模型的版本字段,一个字符串字段。我通过该字段(“-version”)定义了我的 Django 管理员排序。 问题是 python 的版本比较在字符串方面不起作用。例如:

vers=['5.10.0.','5.9.0','5.8.0']
vers[0]>vers[1]
>>False

应该是。 如何在不更改模型的情况下编写自定义排序? 我看到了this question,但它只适用于聚合函数。 注意:我需要 ordering 的解决方案,而不是 list_filter,我已经有了答案 here。我将查找更改如下:

def lookups(self, request, model_admin):
    qs = model_admin.queryset(request)
    vers = qs.values_list('version', flat=True).distinct().order_by('-version')
    s_vers = [tuple([int(x) for x in n.split('.')]) for n in vers]
    s_vers = sorted(s_vers, reverse=True)
    ns_vers = ['.'.join(map(str, x)) for x in s_vers]
    ret_vers = []

    for v in ns_vers:
        ret_vers.append((v, v))

    return ret_vers

【问题讨论】:

我认为这在 django admin 中是不可能的。排序取决于模型字段,以及它们值之间的标准比较。无法使用如此复杂的比较来应用排序。 【参考方案1】:

这是我解决这个问题的方法:

class MyModelAdmin(admin.ModelAdmin):

    def get_queryset(self, request):
        qs = super(MyModelAdmin, self).get_queryset(request)
        qs = qs.extra(select='nversion': "string_to_array(version, '.')::bigint[]").order_by('-nversion')
        return qs

    def vers(self, obj):
        return obj.nversion

    ordering = ('-nversion',)

【讨论】:

以上是关于Django 管理员:自定义排序的主要内容,如果未能解决你的问题,请参考以下文章

url查询中的Django自定义排序

Django admin:如何通过自定义方法对列进行排序

基于列表显示中的自定义可调用在 Django Admin 中排序

从显示自定义字段的 Django 模型呈现可排序表的最佳方法?

在 Wordpress 中,如何将自定义帖子类型的默认管理员排序顺序设置为自定义列?

自定义类签发校验token-实现多方式登录-自定义反爬类-admin后台表管理字段自定义-群查接口-搜索-排序-分页