Django,如何按日期对模型进行分组?

Mr.*_*r.D 6 python django

可以说我有MyModel那个 hascreated_atnamefields。created_at是日期时间。

假设我有以下模型对象:

<id: 1, name: A, created_at: 04.06.2020T17:49>
<id: 2, name: B, created_at: 04.06.2020T18:49>
<id: 3, name: C, created_at: 05.06.2020T20:00>
<id: 4, name: D, created_at: 06.06.2020T19:20>
<id: 5, name: E, created_at: 06.06.2020T13:29>
<id: 6, name: F, created_at: 06.06.2020T12:55>
Run Code Online (Sandbox Code Playgroud)

我想查询将按以下顺序返回给我这些模型:

[
    04.06.2020: [<id: 1, name: A, created_at: 04.06.2020T17:49>, <id: 2, name: B, created_at: 04.06.2020T18:49>],
    05.06.2020: [<id: 3, name: C, created_at: 05.06.2020T20:00>]
    06.06.2020: [<id: 4, name: D, created_at: 06.06.2020T19:20>, <id: 5, name: E, created_at: 06.06.2020T13:29>, <id: 6, name: F, created_at: 06.06.2020T12:55>]
]
Run Code Online (Sandbox Code Playgroud)

我想按created_at字段对所有模型进行分组,但只使用Date部分DateTime字段。我知道我可以通过使用 python 循环来获得那种结果,但是有没有 Django ORM 方法来解决这个问题?

Sim*_*tte 5

ORM 本身无法返回模型列表,但itertools.groupby假设您首先在数据库级别订购数据集,则可以用于此目的。

from itertools import groupby
from operator import attrgetter

from django.db.models.functions import TruncDate

queryset = MyModel.objects.annotate(
    created_at_date=TruncDate('created_at'),
).order_by('created_at')
groupedset = groupby(queryset, attrgetter('created_at_date'))
Run Code Online (Sandbox Code Playgroud)

然后您将能够迭代groupedset使用

for date, objects in groupedset:
    ...
Run Code Online (Sandbox Code Playgroud)