Django-tables2: Разрешить столбцам с сортировкой по убыванию помещать пустые значения внизу столбца

Созданный на 2 авг. 2018  ·  6Комментарии  ·  Источник: jieter/django-tables2

При работе с нисходящими столбцами в № 595 и № 597 я столкнулся с некоторым поведением сортировки по убыванию, которое кажется немного неправильным.

Рассмотрим такой набор данных:

| Запись | Значение |
| --- | --- |
| А | 3 |
| B | 1 |
| C | - |
| D | - |

При сортировке столбца значений в порядке возрастания пустые значения помещаются в конец списка:

| Запись | Значение |
| --- | --- |
| B | 1 |
| А | 3 |
| C | - |
| D | - |

Но при сортировке по убыванию пустые значения помещаются вверху списка:

| Запись | Значение |
| --- | --- |
| C | - |
| D | - |
| А | 3 |
| B | 1 |

В некоторых случаях пользователь может захотеть «игнорировать» пустые значения при сортировке в порядке убывания и, таким образом, переместить их в конец списка, как и при сортировке по возрастанию. Можно ли это сделать?

Самый полезный комментарий

Ха, ну, возможно, я отговорил себя от необходимости в пиаре. В моем примере желаемое поведение может быть достигнуто с помощью метода 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.

Все 6 Комментарий

Вы видели № 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 :)

Была ли эта страница полезной?
0 / 5 - 0 рейтинги