2016-07-31 13 views
0

Ich habe Versionsfeld für ein Modell, ein String-Feld. Ich habe meine Django-Admin-Reihenfolge nach diesem Feld definiert ("-version").
Das Problem ist Pythons Versionsvergleich funktioniert nicht, wenn es um Zeichenfolgen geht. Zum Beispiel:
Django admin: Benutzerdefinierte Bestellung

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

Sollte wahr sein.

Wie schreibe ich benutzerdefinierte Bestellung, ohne die Modelle zu ändern?
Ich sah this question, aber es funktioniert nur für Aggregationsfunktionen.

Hinweis: Ich brauche Lösung für Bestellung nicht list_filter, die ich bereits eine Antwort here haben. Ich habe die Lookup wie folgt:

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

Ich glaube nicht, dass dies möglich wäre, in django admin ein. Die Reihenfolge hängt von den Modellfeldern und dem Standardvergleich zwischen ihren Werten ab. Mit einem solchen komplexen Vergleich kann die Reihenfolge nicht angewendet werden. –

Antwort

2

Hier ist, wie ich gelöst dies:

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