0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

DjangoのDateTimeFieldのorder_byについて

Last updated at Posted at 2021-04-24

これは、自分の備忘録として記録しています。

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されるようになり、思った形の一覧表が出来上がった。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?