获取最近几天创建的对象列表,按天分组

2024-04-26 12:25:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要得到过去几天创建的对象列表,按天分组,以便在图表中显示数据。你知道吗

我有这个模型:

class Model(Base):
    ...
    created = DateTimeField(default=timezone.now(), editable=False)
    ...

现在我要做的是:

Model.objects.filter(
    created__date__lte=today,
    created__date__gte=today-delta
).values('created').annotate(count=Count('id'))

但是,我得到以下查询集:

<SoftDeletableQuerySet [{'created': datetime.datetime(2018, 10, 15, 13, 5, 35, 208157, tzinfo=<UTC>), 'count': 1}, {'created': datetime.datetime(2018, 10, 15, 13, 5, 35, 297617, tzinfo=<UTC>), 'count': 1}, {'created': datetime.datetime(2018, 10, 15, 13, 5, 35, 385555, tzinfo=<UTC>), 'count': 1}, {'created': datetime.datetime(2018, 10, 15, 13, 5, 35, 474287, tzinfo=<UTC>), 'count': 1}, {'created': datetime.datetime(2018, 10, 15, 13, 5, 35, 507464, tzinfo=<UTC>), 'count': 1}, {'created': datetime.datetime(2018, 10, 15, 13, 5, 35, 552092, tzinfo=<UTC>), 'count': 1}, {'created': datetime.datetime(2018, 10, 15, 13, 5, 35, 585314, tzinfo=<UTC>), 'count': 1}, {'created': datetime.datetime(2018, 10, 15, 13, 5, 35, 618656, tzinfo=<UTC>), 'count': 1}, {'created': datetime.datetime(2018, 10, 15, 13, 5, 35, 652501, tzinfo=<UTC>), 'count': 1}, {'created': datetime.datetime(2018, 10, 15, 13, 5, 35, 696849, tzinfo=<UTC>), 'count': 1}]>

如您所见,对象是按创建日期分组的,但是这个字段是DateTimeField,而不是DateField,因此,以毫秒为单位分组。你知道吗

我试着这么做:

Model.objects.filter(
    created__date__lte=today,
    created__date__gte=today-delta
).values('created__date').annotate(count=Count('id'))

但我得到以下错误:

FieldError: Cannot resolve keyword 'date' into field. Join on 'created' not permitted.

我认为我所需要的是非常普遍的,而且一定有某种枯燥的方法来做到这一点。你知道吗


Tags: 对象todaydatetimedatemodelobjectscountfilter
1条回答
网友
1楼 · 发布于 2024-04-26 12:25:50

您可以使用带有^{} [Django-doc]表达式的.annotate(..)来截断到日期:

from django.db.models.functions import TruncDate

Model.objects.filter(
    created__date__lte=today,
    created__date__gte=today-delta
).annotate(
    day=TruncDate('created')
).values('day').annotate(
    count=Count('id')
).order_by('day')

.order_by是必要的,因为否则您不会“强制”Django使用GROUP BY,因此Count('id')将不包含该特定日期的项目总数。你知道吗

相关问题 更多 >