我的后端设置如下
我有一个日期时间类型的表,名为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
。
感谢。
答案 0 :(得分:1)
您可以尝试:
__date
运算符按DateTimeField
过滤日期部分:createAt__date
,这类似于__lt
或__gt
。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中的两个日期时,您需要更加谨慎。如上所述进行查询时,时区就很重要。希望它会有所帮助。 :)
答案 1 :(得分:0)
Django提供Manager.raw()
来对模型执行原始查询,但原始查询必须包含在您的情况下无用的主键。如果Manager.raw()
不够,您可能需要执行不能完全映射到模型的查询,您可以始终直接访问数据库,使用connection
完全绕模型层进行路由。 connection
对象表示默认的数据库连接。所以你可以执行查询,如。
from django.db import connection
#acquire cursor object by calling connection.cursor()
cursor = connection.cursor()
cursor.execute('SELECT created_at from TABLE_NAME GROUP BY created_at')
执行查询后,您可以遍历游标对象以获取查询结果。