我的后端设置如下
- Postgres 9.5
- Python 2.7
- Django 1.9
我有一个日期时间类型的表,名为 createdAt。我想使用 Django ORM 选择只有日期部分的字段,并按 createdAt 归档。
例如,这个createdAt字段可能存储2016-12-10 00:00:00+0、2016-12-11 10:10: 05+0、2016-12-11 17:10:05+0 ...等。
使用Djanggo ORM,输出应该是2016-12-10、2016-12-11。对应的sql应该类似于:SELECT date (createdAt) FROM TABLE GROUP BY createdAt。
谢谢。
请您参考如下方法:
你可以试试:
- 使用
__date运算符按日期部分的DateTimeField过滤:createAt__date,这类似于__lt或__gt。 - 使用annotate/Func/F在
createAt的基础上创建一个仅显示日期部分的额外字段。 - 使用
values和annotate,Count/Sum创建group by查询。
示例代码
from django.db import models
from django.db.models import Func, F, Count
class Post(models.Model):
name = models.CharField('name', max_length=255)
createAt = models.DateTimeField('create at', auto_now=True)
Post.objects.filter(createAt__date='2016-12-26') # filter the date time field for specify date part
.annotate(createAtDate=Func(F('createAt'), function='date')) # create an extra field, named createAtDate to hold the date part of the createAt field, this is similar to sql statement: date(createAt)
.values('createAtDate') # group by createAtDate
.annotate(count=Count('id')) # aggregate function, like count(id) in sql statement
输出
[{'count': 2, 'createAtDate': datetime.date(2016, 12, 26)}]
注意事项:
- 为了指定每个方法的功能,我将长语句分成若干部分,因此您在将其粘贴到代码中时需要删除回车符。
- 当您在应用程序中打开时区时,如
USE_TZ = True,在 django 中比较两个日期时需要更加小心。进行上述查询时,时区很重要。
希望对您有所帮助。 :)
