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.
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:
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:
, die Objekte, sortiert nach der Straßennummer, zuerst numerisch, dann alphabetisch, z.B. ...14, 15a, 15b, 16, 16a, 17...
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.
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:
Wenn Sie nicht-numerische Zeichen zulassen möchten (z. B. 0.9.0 beta
, 2.0.0 stable
):