2016-07-31 112 views
0

我有版本字段的模型,字符串字段。我定義了由該字段排序的Django管理員(「-version」)。
問題是python的版本比較不適用於字符串。例如:
Django管理員:定製訂購

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 
+0

我不認爲這將有可能在Django管理。排序取決於模型字段,以及它們的值之間的標準比較。使用這種複雜的比較無法應用排序。 –

回答

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