これは、自分の備忘録として記録しています。
ListViewで目的にあった一覧表を作りたい。
今回作りたかった表は次のようなもの
id | date | group |
---|---|---|
1 | 2021年04月01日(木)09:34:09 | A |
2 | 2021年04月01日(木)13:19:04 | A |
3 | 2021年04月01日(木)12:32:05 | B |
4 | 2021年04月01日(木)12:32:58 | B |
5 | 2021年03月31日(水)09:34:09 | A |
6 | 2021年03月31日(水)13:19:04 | B |
models.py
# 必要なところだけ抜き出しています。
# idはprimary keyとして生成されるものなので固定値
date = models.DateTimeField(verbose_name='登録日', default=timezone.now)
group = models.CharField(verbose_name='担当グループ', max_length=32)
「目的の順番に並べ替えるには、登録日、担当グループでorder_byすれば良さそう。」
views.py
order = ('date', 'group',)
return Report.objects.all().order_by(*order)
とでやってみると
id | date | group |
---|---|---|
1 | 2021年04月01日(木)09:34:09 | A |
3 | 2021年04月01日(木)12:32:05 | B |
4 | 2021年04月01日(木)12:32:58 | B |
2 | 2021年04月01日(木)13:19:04 | A |
5 | 2021年03月31日(水)09:34:09 | A |
6 | 2021年03月31日(水)13:19:04 | B |
できているようで、思ったものと違う(1,3,4,2)。
しばらく悩んだ末、DateTimeFieldなので、時刻も含んだ形でグルーピングされてしまうためだと気づいた。
同一時刻であれば思ったように表示されるが、そうならないのが現状。
つまり、DateTimeFieldの値から、日付部分でグルーピングできれば思った形にできそう。
views.py
order = ('date__date', 'group',)
return Report.objects.all().order_by(*order)
というようにQueryset filterを使ってdate__dateとしてやれば、第一グループはDateTimeFieldの日付部分のみでorder_byされるようになり、思った形の一覧表が出来上がった。