33

我正在尝试按 DAY 对产品进行分组,但是 date_created 是一个日期时间字段。

Product.objects.values('date_created') \
               .annotate(available=Count('available_quantity'))

返回:

[
    {'date_created': datetime.datetime(2012, 4, 14, 13, 3, 6), 'available': 1},
    {'date_created': datetime.datetime(2012, 4, 14, 17, 12, 9), 'available': 1},
    ...
]

我想:

[
    {'date_created': datetime.datetime(2012, 4, 14), 'available': 2}, ...
]

编辑:数据库后端MYSQL

4

5 回答 5

43

这个问题的启发,试试这个 for MySQL

from django.db.models import Count

Product.objects.extra(select={'day': 'date( date_created )'}).values('day') \
               .annotate(available=Count('date_created'))
于 2012-04-14T14:38:37.007 回答
6

San4ez的答案类似,但将日期返回为 'YYYY-MM-DD' 而不是 'datetime.datetime(YYYY, MM, DD)':

Product.objects.extra(select={'day': "TO_CHAR(date_created, 'YYYY-MM-DD')"})
               .values('day') \
               .order_by('day') \
               .annotate(available=Count('date_created'))
于 2018-08-10T00:33:19.873 回答
1

在 Django 1.4 中,您可以.dates('date_created', 'day')使用.values().

试试这个代码片段:

Product.objects.annotate(available=Count('available_quantity')) \
  .dates('date_created', 'day')

应该返回:

[
    {'date_created': datetime.datetime(2012, 4, 14), 'available': 2}, ...
]
于 2012-04-14T14:05:41.303 回答
0

你可以试试

Product.objects.extra(select={'day': "TO_CHAR(date_created, 'YYYY-MM-DD')"})\
                .values('day')\
                .order_by('day')\
                .annotate(bets=Count('date_created'))
于 2020-08-14T10:57:18.637 回答
0

通过遵循 San4ez 的回答和Zanon变化

对我来说,我必须制定一个解决方法来使用 Postgres 或 Sqlite,因为 Count() 函数将考虑 datetime 字段,如果你要创建一个“day”输入只是与日期无关,因为 date_created 仍然保存时间信息,因此多个带有时间的记录不会被合并和计数,在尝试了很多不同的事情之后,我达到了跳过时间的方式

姜戈 2.2

from django.db.models import Count

# Change date() to to_char(created_at, 'YYYY-MM-DD') if using Postgres
Product.objects.extra(select={'day': 'date( date_created )'})\
    .values('day') \
    .order_by('date_created__date')\
    .annotate(available=Count('date_created__date'))
于 2021-01-04T11:19:04.857 回答