Saat bekerja dengan kolom menurun di #595 dan #597 , saya menemukan beberapa perilaku pengurutan menurun yang tampaknya sedikit menyimpang.
Pertimbangkan satu set data seperti ini:
| Rekam | Nilai |
| --- | --- |
| Sebuah | 3 |
| B | 1 |
| C | - |
| D | - |
Saat mengurutkan kolom Nilai dalam urutan menaik, nilai kosong didorong ke bagian bawah daftar:
| Rekam | Nilai |
| --- | --- |
| B | 1 |
| Sebuah | 3 |
| C | - |
| D | - |
Tetapi saat mengurutkan dalam urutan menurun, nilai kosong ditempatkan di bagian atas daftar:
| Rekam | Nilai |
| --- | --- |
| C | - |
| D | - |
| Sebuah | 3 |
| B | 1 |
Dalam beberapa kasus, pengguna ingin "mengabaikan" nilai kosong saat mengurutkan dalam urutan menurun, dan dengan demikian mendorongnya ke bagian bawah daftar, sama seperti dengan naik. Bisakah ini dilakukan?
Apakah Anda melihat #529?
Oh, aku melihatnya sekarang. Hm, mungkin saya bisa melihat membuat PR untuk itu juga.
Akan sangat menyambut!
Hah, well, saya mungkin telah berbicara sendiri tentang kebutuhan akan PR. Dalam kasus contoh saya, perilaku yang diinginkan dapat dicapai dengan menggunakan metode order_FOO()
, dan parameter nulls_last
Django. Seperti:
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)
Ini menghasilkan nilai nol yang selalu diurutkan di akhir kolom. Ini berfungsi untuk kasus yang saya perlukan, karena saya dapat memastikan bahwa basis data saya selalu menggunakan nol untuk nilai kosong.
Saya menguji solusi ini untuk kasus-kasus ketika nilainya kosong, dan itu tidak berfungsi. Saya menduga solusi dapat dibuat dengan memodifikasi sesuatu dalam django-tables2
order_by
, tetapi jika kita berbicara tentang kasus tepi, mungkin sort-with-nulls-last order_FOO()
solusi lebih baik daripada mengacaukan sumbernya.
Bagaimanapun, saya dapat menganggap permintaan saya ditutup. Jika orang lain menuntut untuk memperlakukan nilai yang benar-benar kosong dengan cara yang sama, mungkin PR dapat ditinjau kembali.
Terima kasih telah menjelaskan!
terima kasih atas solusi yang bagus ini @foldedpaper :)
Komentar yang paling membantu
Hah, well, saya mungkin telah berbicara sendiri tentang kebutuhan akan PR. Dalam kasus contoh saya, perilaku yang diinginkan dapat dicapai dengan menggunakan metode
order_FOO()
, dan parameternulls_last
Django. Seperti: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)
Ini menghasilkan nilai nol yang selalu diurutkan di akhir kolom. Ini berfungsi untuk kasus yang saya perlukan, karena saya dapat memastikan bahwa basis data saya selalu menggunakan nol untuk nilai kosong.
Saya menguji solusi ini untuk kasus-kasus ketika nilainya kosong, dan itu tidak berfungsi. Saya menduga solusi dapat dibuat dengan memodifikasi sesuatu dalam
django-tables2
order_by
, tetapi jika kita berbicara tentang kasus tepi, mungkin sort-with-nulls-lastorder_FOO()
solusi lebih baik daripada mengacaukan sumbernya.Bagaimanapun, saya dapat menganggap permintaan saya ditutup. Jika orang lain menuntut untuk memperlakukan nilai yang benar-benar kosong dengan cara yang sama, mungkin PR dapat ditinjau kembali.