Lorsque je travaillais avec des colonnes descendantes dans #595 et #597 , je suis tombé sur un comportement de tri descendant qui semble un peu décalé.
Considérons un ensemble de données comme celui-ci :
| Enregistrer | Valeur |
| --- | --- |
| A | 3 |
| B | 1 |
| C | - |
| D | - |
Lors du tri de la colonne Valeur par ordre croissant, les valeurs vides sont poussées en bas de la liste :
| Enregistrer | Valeur |
| --- | --- |
| B | 1 |
| A | 3 |
| C | - |
| D | - |
Mais lors du tri par ordre décroissant, les valeurs vides sont placées en haut de la liste :
| Enregistrer | Valeur |
| --- | --- |
| C | - |
| D | - |
| A | 3 |
| B | 1 |
Dans certains cas, un utilisateur souhaiterait « ignorer » les valeurs vides lors du tri par ordre décroissant, et ainsi les pousser vers le bas de la liste, de la même manière qu'avec l'ordre croissant. Cela peut-il être fait?
Avez-vous vu #529 ?
Oh, je le vois maintenant. Hm, peut-être que je peux jeter un œil à faire un PR pour ça aussi.
Serait très bienvenu !
Hah, eh bien, je me suis peut-être dissuadé d'avoir besoin d'un RP. Dans mon exemple, le comportement souhaité peut être obtenu en utilisant la méthode order_FOO()
et le paramètre nulls_last
Django. Ainsi:
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)
Il en résulte que les valeurs nulles sont toujours triées à la fin de la colonne. Cela fonctionne pour les cas où j'en ai besoin, car je peux m'assurer que ma base de données utilise toujours null pour les valeurs vides.
J'ai testé cette solution pour les cas où les valeurs sont simplement vides et cela ne fonctionne pas. Je soupçonne qu'une solution pourrait être trouvée en modifiant quelque chose dans le comportement de django-tables2
order_by
, mais si nous parlons de toute façon d'un cas limite, peut-être le sort-with-nulls-last order_FOO()
solution order_FOO()
est meilleure que de jouer avec la source.
Dans tous les cas, je peux considérer ma demande comme close. Si quelqu'un d'autre réclame de traiter les valeurs strictement vides de la même manière, peut-être qu'un PR peut être revisité.
Merci d'avoir expliqué !
merci pour cette belle solution de contournement @foldedpaper :)
Commentaire le plus utile
Hah, eh bien, je me suis peut-être dissuadé d'avoir besoin d'un RP. Dans mon exemple, le comportement souhaité peut être obtenu en utilisant la méthode
order_FOO()
et le paramètrenulls_last
Django. Ainsi: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)
Il en résulte que les valeurs nulles sont toujours triées à la fin de la colonne. Cela fonctionne pour les cas où j'en ai besoin, car je peux m'assurer que ma base de données utilise toujours null pour les valeurs vides.
J'ai testé cette solution pour les cas où les valeurs sont simplement vides et cela ne fonctionne pas. Je soupçonne qu'une solution pourrait être trouvée en modifiant quelque chose dans le comportement de
django-tables2
order_by
, mais si nous parlons de toute façon d'un cas limite, peut-être le sort-with-nulls-lastorder_FOO()
solutionorder_FOO()
est meilleure que de jouer avec la source.Dans tous les cas, je peux considérer ma demande comme close. Si quelqu'un d'autre réclame de traiter les valeurs strictement vides de la même manière, peut-être qu'un PR peut être revisité.