Django 将日期解析为 QuerySet 中的 dd-mm-yyyy

Posted

技术标签:

【中文标题】Django 将日期解析为 QuerySet 中的 dd-mm-yyyy【英文标题】:Django parse date to dd-mm-yyyy in QuerySet 【发布时间】:2020-07-29 11:32:59 【问题描述】:

我有以下 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 无法正常工作。它必须是DATE 类型。

【问题讨论】:

【参考方案1】:

您可以使用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')

未经测试的代码

Based on this answer,你可以这样试试:

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

【讨论】:

问题不在于将其转换为DateField,它已经是一个DateField。问题是它没有返回想要的格式。 未经测试的代码不适用于 SQL Server,DATE_FORMAT 不是函数。另一个 posibiltiy 返回 2024 而不是 2-3-2019。它将所有数字加到 2024 年,但我不知道为什么

以上是关于Django 将日期解析为 QuerySet 中的 dd-mm-yyyy的主要内容,如果未能解决你的问题,请参考以下文章

将日期时间字符串解析为 Django DateTimeField

按日期时间的月/日订购 Django QuerySet?

Django QuerySet 是不是使用二进制搜索按日期过滤?

Django - 如何将 QuerySet 转换为 Q 对象?

django model 条件过滤 queryset.filter(**condtions) 用法

Django:将带有相关对象的 QuerySet 转换为 JSON