可以说我有MyModel那个 hascreated_at和namefields。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 方法来解决这个问题?
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)
| 归档时间: |
|
| 查看次数: |
273 次 |
| 最近记录: |