Bei der Arbeit mit absteigenden Spalten in #595 und #597 bin ich auf ein absteigendes Sortierverhalten gestoßen, das ein wenig abwegig erscheint.
Betrachten Sie einen Datensatz wie diesen:
| Aufnahme | Wert |
| --- | --- |
| A | 3 |
| B | 1 |
| C | - |
| D | - |
Beim Sortieren der Wertspalte in aufsteigender Reihenfolge werden die leeren Werte an das Ende der Liste verschoben:
| Aufnahme | Wert |
| --- | --- |
| B | 1 |
| A | 3 |
| C | - |
| D | - |
Beim Sortieren in absteigender Reihenfolge werden die leeren Werte jedoch oben in der Liste platziert:
| Aufnahme | Wert |
| --- | --- |
| C | - |
| D | - |
| A | 3 |
| B | 1 |
In einigen Fällen möchte ein Benutzer die leeren Werte beim Sortieren in absteigender Reihenfolge "ignorieren" und sie dadurch an das Ende der Liste verschieben, genau wie beim Aufsteigen. Kann dies getan werden?
Hast du #529 gesehen?
Oh, ich sehe es jetzt. Hm, vielleicht kann ich auch mal eine PR dafür machen.
Wäre sehr willkommen!
Hah, nun, ich habe mir vielleicht die Notwendigkeit einer PR ausgeredet. In meinem Beispielfall kann das gewünschte Verhalten order_FOO()
Methode nulls_last
Django erreicht werden. Wie so:
def order_value(self, QuerySet, is_descending):
if is_descending:
QuerySet = QuerySet.order_by(F('value').desc(nulls_last = True))
else:
QuerySet = QuerySet.order_by(F('value').asc(nulls_last = True))
return (QuerySet,True)
Dies führt dazu, dass Nullwerte immer am Ende der Spalte sortiert werden. Dies funktioniert in den Fällen, in denen ich es brauche, da ich sicherstellen kann, dass meine Datenbank immer null für leere Werte verwendet.
Ich habe diese Lösung für Fälle getestet, in denen die Werte einfach leer sind und sie nicht funktioniert. Ich vermute, dass eine Lösung gefunden werden könnte, indem man etwas innerhalb des Verhaltens von django-tables2
order_by
ändert, aber wenn wir sowieso über einen Randfall sprechen, vielleicht die Sortierung mit Nullen-letzten order_FOO()
Workaround ist besser, als mit der Quelle herumzuspielen.
In jedem Fall kann ich meine Anfrage als abgeschlossen betrachten. Wenn jemand anderes verlangt, streng leere Werte auf die gleiche Weise zu behandeln, kann vielleicht eine PR überdacht werden.
Danke fürs Erklären!
danke für diesen netten Workaround @foldedpaper :)
Hilfreichster Kommentar
Hah, nun, ich habe mir vielleicht die Notwendigkeit einer PR ausgeredet. In meinem Beispielfall kann das gewünschte Verhalten
order_FOO()
Methodenulls_last
Django erreicht werden. Wie so:def order_value(self, QuerySet, is_descending): if is_descending: QuerySet = QuerySet.order_by(F('value').desc(nulls_last = True)) else: QuerySet = QuerySet.order_by(F('value').asc(nulls_last = True)) return (QuerySet,True)
Dies führt dazu, dass Nullwerte immer am Ende der Spalte sortiert werden. Dies funktioniert in den Fällen, in denen ich es brauche, da ich sicherstellen kann, dass meine Datenbank immer null für leere Werte verwendet.
Ich habe diese Lösung für Fälle getestet, in denen die Werte einfach leer sind und sie nicht funktioniert. Ich vermute, dass eine Lösung gefunden werden könnte, indem man etwas innerhalb des Verhaltens von
django-tables2
order_by
ändert, aber wenn wir sowieso über einen Randfall sprechen, vielleicht die Sortierung mit Nullen-letztenorder_FOO()
Workaround ist besser, als mit der Quelle herumzuspielen.In jedem Fall kann ich meine Anfrage als abgeschlossen betrachten. Wenn jemand anderes verlangt, streng leere Werte auf die gleiche Weise zu behandeln, kann vielleicht eine PR überdacht werden.