Django:分组在数据库中不存在的两个日期范围之间

时间:2018-02-06 09:53:18

标签: python mysql django date group-by

我目前正在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')

1 个答案:

答案 0 :(得分:0)

是的,有一种方法可以先进行注释,然后对其进行过滤。

你写

q.annotate( Time=TruncMonth('csrfcreateddate') ).values('Time') .annotate( Count=Count('csrfrating') ).values('Time', 'Count')

if elif块之前的这一行Django首先进行注释,然后对其进行过滤。 你也可以看here