Django: Ordnen Sie den numerischen Wert mit order_by

8

Ich bin in einer Situation, in der ich eine ziemlich große Liste von Objekten durch ein CharField ausgeben muss, das verwendet wird, um Straßenadressen zu speichern.

Mein Problem ist, dass die Daten offensichtlich nach ASCII-Codes geordnet sind, da es ein Charfield ist, mit den vorhersagbaren Ergebnissen. Es sortiert die Zahlen so;

%Vor%

Jetzt wäre der offensichtliche Schritt, den Charfield den richtigen Feldtyp zu ändern (IntegerField sagen wir mal), aber es kann nicht funktionieren, da einige Adressen Apartments haben können, wie "128A".

Ich weiß wirklich nicht, wie ich das richtig bestellen kann.

    
h3. 03.06.2010, 20:03
quelle

6 Antworten

16

Wenn Sie sicher sind, dass nur ganze Zahlen in dem Feld vorhanden sind, könnten Sie die Datenbank veranlassen, sie über die Methode extra als Ganzzahl zu interpretieren und dabei zu sortieren:

%Vor%     
Daniel Roseman 03.06.2010, 21:41
quelle
9

Wenn Sie PostgreSQL verwenden (MySQL nicht sicher), können Sie sicher folgenden Code in char / text-Feldern verwenden und Cast-Fehler vermeiden:

%Vor%     
darklow 20.03.2013 16:20
quelle
7

Django versucht deprecate die Methode extra() , hat aber Cast() in v1 eingeführt .10. In% sqlite (%) kann CAST einen Wert wie 10a annehmen und wird in die Ganzzahl 10 umgewandelt, so dass Sie:

%Vor%

, die Objekte, sortiert nach der Straßennummer, zuerst numerisch, dann alphabetisch, z.B. ...14, 15a, 15b, 16, 16a, 17...

    
practual 25.09.2016 13:38
quelle
3

Toller Tipp! Für mich geht das! :) Das ist mein Code:

%Vor%     
diegor 20.01.2011 11:34
quelle
2

Das Problem, mit dem Sie es zu tun haben, ähnelt dem, wie Dateinamen beim Sortieren nach Dateinamen sortiert werden. Dort soll "2 Foo.mp3" vor "12 Foo.mp3" erscheinen.

Ein gängiger Ansatz besteht darin, Zahlen zu "normalisieren", um sie auf eine feste Anzahl von Stellen zu erweitern und dann auf der normalisierten Form zu sortieren. Das heißt, zum Zwecke der Sortierung könnte "2 Foo.mp3" auf "0000000002 Foo.mp3" erweitert werden.

Django wird dir hier nicht direkt helfen. Sie können entweder ein Feld hinzufügen, um die "normalisierte" Adresse zu speichern, und die Datenbank order_by , oder Sie können eine benutzerdefinierte Sortierung in Ihrer Ansicht (oder in einem Helfer, den Ihre Ansicht verwendet) in Adressdatensätzen vor der Übergabe der Liste vornehmen von Datensätzen zu einer Vorlage.

    
Dave W. Smith 03.06.2010 20:22
quelle
1

Wenn Sie Versionsnummern sortieren müssen, die aus mehreren durch einen Punkt getrennten Zahlen bestehen (z. B. 1.9.0, 1.10.0 ), finden Sie hier eine Postgres-only-Lösung:

%Vor%

Wenn Sie nicht-numerische Zeichen zulassen möchten (z. B. 0.9.0 beta , 2.0.0 stable ):

%Vor%     
Max Malysh 08.08.2017 04:34
quelle

Tags und Links