我正在尝试按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
答案 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)
对我来说,我不得不做一个解决方法来使用 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}, ...
]