大家好,欢迎来到IT知识分享网。

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.Z" }, { "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’) 是最简单也最高效的日期格式化操作,但是配置比较麻烦,如果需要大批量修改的话就比较麻烦,如果想要灵活的控制格式化操作,可以通过自定义的方式来实现。后面两种方案,从整体设计的角度上都是对前面方案的扩展,在实际开发中可以根据具体的需求来实现选择合适的方案。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/172063.html