首页 > 解决方案 > Django 将日期解析为 QuerySet 中的 dd-mm-yyyy

问题描述

我有以下 QuerySet 来检索 SQL Server 数据库中记录计数的所有日期。

    def get_amount_per_day(self):
        return self.extra(select={'time': 'CONVERT(DATE, starttime)'}).values(
            'time').annotate(amount=Count('starttime')).order_by('time')

输出是:

{
        "time": "2019-03-07T00:00:00",
        "amount": 216
    },
    {
        "time": "2019-03-07T01:00:00",
        "amount": 178
    }
}

但我想将日期解析为07-03-2019,有谁知道我怎么能做到这一点?

我试图将日期转换为,varchar但随后order_by无法正常工作。它必须是 type DATE

标签: sql-serverdjangodjango-rest-frameworkdjango-queryset

解决方案


您可以使用Cast. 例如:

from django.db.models.functions import Cast
from django.db.models import DateField

YourModel.objects.annotate(start_date=Cast('starttime', DateField()))

更新

你可以尝试这样使用database functions

from django.db.models.functions import ExtractDay, ExtractMonth, ExtractYear

YourModel.objects.annotate(
    year=ExtractYear('starttime'),
    month=ExtractMonth('starttime'),
    day=ExtractDay('starttime')
).annotate(start_date=F('date')+'-'+F('month')+'-'+F('year')).values('start_date')

未经测试的代码

基于这个答案,你可以这样尝试:

YourModel.objects.annotate(start_date=ExpressionWrapper(
        Func(F('starttime'), Value('%d-%m-%Y'), function='DATE_FORMAT'), output_field=CharField()
    ))

推荐阅读