领先的免费Web技术教程,涵盖HTML到ASP.NET

网站首页 > 知识剖析 正文

Django RESTFul接口如何对返回时间进行格式化?

nixiaole 2025-03-29 20:26:11 知识剖析 16 ℃

Django REST Framework (DRF)框架中,想要对接口返回的时间进行格式化的操作,可以通过如下的几种方式来实现。

使用DateTimeField的format参数

在DRF中有一个DateTimeField类,提供了一个用来进行参数格式化的工具,我们可以通过如下的方式来对指定的时间进行格式化操作,在自定义的serializers中添加如下的代码。

# myapp/serializers.py
from rest_framework import serializers
from .models import Article

class ArticleSerializer(serializers.ModelSerializer):
    created_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S")
    class Meta:
        model = Article
        fields = ['id', 'title', 'content', 'created_at', 'updated_at']

在上面的例子中,我们通过DateTimeField格式化方式对创建时间进行了格式化,最终返回结果如下所示。

[
    {
        "id": 1,
        "title": "测试文章",
        "content": "测试文章内容",
        "created_at": "2025-02-17 07:51:47",
        "updated_at": "2025-02-17T07:51:47.755496Z"
    },
    {
        "id": 2,
        "title": "测试文章2",
        "content": "测试文章内容2",
        "created_at": "2025-02-17 07:52:00",
        "updated_at": "2025-02-17T07:52:00.008860Z"
    }
]

当然如果我们希望对时间格式进行更加复杂的处理的话,可以通过自定义的方式来实现。

自定义时间格式化字段

自定义的时间格式化操作,可以支持对时间的更为复杂的格式化操作,例如需要动态的对时间格式进行格式化,可以通过自定义格式化类的方式来实现,如下所示。

from rest_framework import serializers
from datetime import datetime

class CustomDateTimeField(serializers.DateTimeField):
    def to_representation(self, value):
        if value is not None:
            # 自定义时间格式化
            return value.strftime('%Y-%m-%d %H:%M:%S')
        return None

class MyModelSerializer(serializers.ModelSerializer):
    created_at = CustomDateTimeField()

    class Meta:
        model = MyModel
        fields = ['id', 'name', 'created_at']

在上面的例子中,我们定义了一个CustomDateTimeField类,然后对to_representation方法进行了重写,来对时间进行格式化操作。

使用全局配置

当然有时候,如果是全局事件都希望通过同样的格式化操作来完成的话,我们可以在 settings.py 中通过使用 DATETIME_FORMAT 配置来设置全局的时间格式,这个配置会影响所有的 DateTimeField 的默认格式。如下所示。

# settings.py

DATETIME_FORMAT = 'Y-m-d H:i:s'

这样所有 DateTimeField 字段默认都会使用这个格式,除非在 serializer 中显式覆盖。

使用json输出时格式化

既然我们RESTFul接口返回的是JSON格式的数据,那么,我们就可以通过JSON格式化的方式来对返回数据的时间进行格式化操作,如下所示,我们可以通过JSONRenderer 来进行格式化。

from rest_framework.renderers import JSONRenderer
from rest_framework.response import Response

class CustomJSONRenderer(JSONRenderer):
    def render(self, data, accepted_media_type=None, renderer_context=None):
        # 自定义处理时间格式
        if isinstance(data, dict):
            for key, value in data.items():
                if isinstance(value, str) and 'T' in value:  # 假设是时间字段
                    try:
                        value = datetime.fromisoformat(value)
                        data[key] = value.strftime('%Y-%m-%d %H:%M:%S')
                    except ValueError:
                        pass
        return super().render(data, accepted_media_type, renderer_context)

然后需要在 settings.py 中配置,如下的内容来支持时间格式化。

# settings.py
REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': [
        'path.to.CustomJSONRenderer',
    ],
}

这样,我们就实现了对所有JSON响应中的字段都能够按照指定格式进行输出。

总结

根据上面的介绍通过 serializer 中使用 DateTimeField(format='your_format') 是最简单也最高效的日期格式化操作,但是配置比较麻烦,如果需要大批量修改的话就比较麻烦,如果想要灵活的控制格式化操作,可以通过自定义的方式来实现。后面两种方案,从整体设计的角度上都是对前面方案的扩展,在实际开发中可以根据具体的需求来实现选择合适的方案。

Tags:

最近发表
标签列表