Django ORM,白天组

时间:2012-04-14 14:00:03

标签: python mysql django django-orm

我正在尝试按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

6 个答案:

答案 0 :(得分:29)

this question的启发尝试使用mysql

Product.objects.extra(select={'day': 'date( date_created )'}).values('day') \
               .annotate(available=Count('date_created'))

答案 1 :(得分:0)

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'))

答案 2 :(得分:0)

尝试:

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

希望有帮助。

答案 3 :(得分:0)

您可以尝试

Product.objects.extra(select={'day': "TO_CHAR(date_created, 'YYYY-MM-DD')"})\
                .values('day')\
                .order_by('day')\
                .annotate(bets=Count('date_created'))

答案 4 :(得分:0)

按照San4ez的回答和Zanon的变化

对我来说,我不得不做一个解决方法来使用 Postgres 或 Sqlite,因为 Count() 函数会考虑日期时间字段,如果你只用日期创建一个“天”输入并不重要,因为date_created 仍然保留时间信息,因此不会合并和计数带有时间的多条记录,在尝试了很多不同的事情后,我达到了跳过时间的方式

Django 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'))

答案 5 :(得分:-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}, ...
]