我目前正在Django Rest Framework中创建一个API,并且我正在过滤用户给出的日期(来自前端),之后我将它分组几个月。我面临的问题是,如果开始日期小于min(createddate),那么我得到的数据将被过滤,而不是我需要从开始日期到结束日期的分组时间(按范围分组),如果几个月没有数据,则数据库应返回0.
我知道SQL(我使用SQL作为我的数据库)首先评估where子句和分组后,是否有办法先对数据进行分组,然后我们可以应用where子句。
例如:
Body
- 我正在转到API
{
"StartDate":"2017-06-01",
"EndDate":"2017-08-08"
}
Current Response
- 我从API获取
"data": [
{
"key": "Count",
"bar": true,
"values": [
[
"2017-08-01T00:00:00",
1501545600000,
1
]
]
}
]
Correct Response
- 我想从数据
"data": [
{
"key": "Count",
"bar": true,
"values": [
[
"2017-06-01T00:00:00",
1496255400000,
0
],
[
"2017-07-01T00:00:00",
1498847400000,
0
],
[
"2017-08-01T00:00:00",
1501545600000,
1
]
]
}
]
Django ORM查询:
q=ConsumerServicerequestFeedback.objects.values_list('csrfrating').filter(status)
if len(StartDate) != 0 and len(EndDate) == 0:
StartDate = datetime.strptime(StartDate, '%Y-%m-%d')
next_day = StartDate + timedelta(1)
q = q.filter(csrfcreateddate__range=[StartDate, next_day])
elif len(StartDate) != 0 and len(EndDate) != 0:
q = q.filter(csrfcreateddate__range=[StartDate, EndDate])
elif len(StartDate) == 0 and len(EndDate) != 0:
EndDate = datetime.strptime(EndDate, '%Y-%m-%d')
q = q.filter(csrfcreateddate__lte=EndDate)
q.annotate(Time=TruncMonth('csrfcreateddate')).values('Time').annotate(Count=Count('csrfrating')).values('Time', 'Count')
答案 0 :(得分:0)
是的,有一种方法可以先进行注释,然后对其进行过滤。
你写
q.annotate(
Time=TruncMonth('csrfcreateddate')
).values('Time')
.annotate(
Count=Count('csrfrating')
).values('Time', 'Count')
在if elif
块之前的这一行Django首先进行注释,然后对其进行过滤。
你也可以看here