При работе с нисходящими столбцами в № 595 и № 597 я столкнулся с некоторым поведением сортировки по убыванию, которое кажется немного неправильным.
Рассмотрим такой набор данных:
| Запись | Значение |
| --- | --- |
| А | 3 |
| B | 1 |
| C | - |
| D | - |
При сортировке столбца значений в порядке возрастания пустые значения помещаются в конец списка:
| Запись | Значение |
| --- | --- |
| B | 1 |
| А | 3 |
| C | - |
| D | - |
Но при сортировке по убыванию пустые значения помещаются вверху списка:
| Запись | Значение |
| --- | --- |
| C | - |
| D | - |
| А | 3 |
| B | 1 |
В некоторых случаях пользователь может захотеть «игнорировать» пустые значения при сортировке в порядке убывания и, таким образом, переместить их в конец списка, как и при сортировке по возрастанию. Можно ли это сделать?
Вы видели № 529?
О, теперь я это вижу. Хм, может, я тоже смогу сделать пиар для этого.
Было бы очень приятно!
Ха, ну, возможно, я отговорил себя от необходимости в пиаре. В моем примере желаемое поведение может быть достигнуто с помощью метода order_FOO()
и параметра nulls_last
Django. Вот так:
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)
Это приводит к тому, что значения NULL всегда сортируются в конце столбца. Это работает в тех случаях, когда мне это нужно, потому что я могу гарантировать, что моя база данных всегда использует null для пустых значений.
Я тестировал это решение для случаев, когда значения просто пустые, и оно не работает. Я подозреваю, что решение можно найти, изменив что-то в поведении django-tables2
order_by
, но если мы все равно говорим о граничном случае, возможно, sort-with-nulls-last order_FOO()
обходной путь лучше, чем возиться с исходным кодом.
В любом случае могу считать свою заявку закрытой. Если кто-то еще настаивает на том, чтобы так же поступать и со строго пустыми значениями, возможно, стоит пересмотреть PR.
Спасибо за объяснение!
спасибо за этот хороший обходной путь @foldedpaper :)
Самый полезный комментарий
Ха, ну, возможно, я отговорил себя от необходимости в пиаре. В моем примере желаемое поведение может быть достигнуто с помощью метода
order_FOO()
и параметраnulls_last
Django. Вот так: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)
Это приводит к тому, что значения NULL всегда сортируются в конце столбца. Это работает в тех случаях, когда мне это нужно, потому что я могу гарантировать, что моя база данных всегда использует null для пустых значений.
Я тестировал это решение для случаев, когда значения просто пустые, и оно не работает. Я подозреваю, что решение можно найти, изменив что-то в поведении
django-tables2
order_by
, но если мы все равно говорим о граничном случае, возможно, sort-with-nulls-lastorder_FOO()
обходной путь лучше, чем возиться с исходным кодом.В любом случае могу считать свою заявку закрытой. Если кто-то еще настаивает на том, чтобы так же поступать и со строго пустыми значениями, возможно, стоит пересмотреть PR.