Django管理员:定制订购

时间:2016-07-31 17:58:06

标签: python django django-admin django-filter

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

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

为真

如何在不更改模型的情况下编写自定义订购? 我看到this question,但它仅适用于聚合函数。

注意:我需要排序的解决方案,而不是 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

1 个答案:

答案 0 :(得分:2)

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

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',)