Al trabajar con columnas descendentes en # 595 y # 597, encontré un comportamiento de ordenación descendente que parece un poco fuera de lugar.
Considere un conjunto de datos como este:
| Registro | Valor |
| --- | --- |
| A | 3 |
| B | 1 |
| C | - |
| D | - |
Al ordenar la columna Valor en orden ascendente, los valores vacíos se colocan al final de la lista:
| Registro | Valor |
| --- | --- |
| B | 1 |
| A | 3 |
| C | - |
| D | - |
Pero al ordenar en orden descendente, los valores vacíos se colocan en la parte superior de la lista:
| Registro | Valor |
| --- | --- |
| C | - |
| D | - |
| A | 3 |
| B | 1 |
En algunos casos, un usuario querría "ignorar" los valores vacíos al ordenar en orden descendente y, por lo tanto, empujarlos al final de la lista, al igual que con el orden ascendente. Se puede hacer esto?
¿Viste el número 529?
Oh, lo veo ahora. Hm, tal vez pueda echarle un vistazo a hacer un PR para eso también.
¡Sería muy bienvenido!
Ja, bueno, puede que me haya convencido de la necesidad de un PR. En mi caso del ejemplo, el comportamiento deseado se puede lograr mediante el uso de la order_FOO()
método y de Django nulls_last
parámetro. Al igual que:
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)
Esto da como resultado que los valores nulos siempre se ordenen al final de la columna. Esto funciona para los casos en que lo necesito, porque puedo asegurarme de que mi base de datos siempre use nulo para valores vacíos.
Probé esta solución para casos en los que los valores simplemente están vacíos y no funciona. Sospecho que se podría hacer una solución modificando algo dentro del comportamiento de django-tables2
order_by
, pero si estamos hablando de un caso de borde de todos modos, tal vez el sort-with-nulls-last order_FOO()
solución alternativa es mejor que jugar con la fuente.
En cualquier caso, puedo considerar cerrada mi solicitud. Si alguien más clama por tratar los valores estrictamente vacíos de la misma manera, tal vez se pueda volver a visitar un RP.
¡Gracias por la explicación!
gracias por esta buena solución @foldedpaper :)
Comentario más útil
Ja, bueno, puede que me haya convencido de la necesidad de un PR. En mi caso del ejemplo, el comportamiento deseado se puede lograr mediante el uso de la
order_FOO()
método y de Djangonulls_last
parámetro. Al igual que: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)
Esto da como resultado que los valores nulos siempre se ordenen al final de la columna. Esto funciona para los casos en que lo necesito, porque puedo asegurarme de que mi base de datos siempre use nulo para valores vacíos.
Probé esta solución para casos en los que los valores simplemente están vacíos y no funciona. Sospecho que se podría hacer una solución modificando algo dentro del comportamiento de
django-tables2
order_by
, pero si estamos hablando de un caso de borde de todos modos, tal vez el sort-with-nulls-lastorder_FOO()
solución alternativa es mejor que jugar con la fuente.En cualquier caso, puedo considerar cerrada mi solicitud. Si alguien más clama por tratar los valores estrictamente vacíos de la misma manera, tal vez se pueda volver a visitar un RP.