网站首页 > 知识剖析 正文
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') 是最简单也最高效的日期格式化操作,但是配置比较麻烦,如果需要大批量修改的话就比较麻烦,如果想要灵活的控制格式化操作,可以通过自定义的方式来实现。后面两种方案,从整体设计的角度上都是对前面方案的扩展,在实际开发中可以根据具体的需求来实现选择合适的方案。
猜你喜欢
- 2025-03-29 Java中时间格式化怎么实现?(java时间格式类型)
- 2025-03-29 Java 8 新特性:Date-Time API(java datetimeformatter)
- 2025-03-29 Python实现系统时间格式化常用方法
- 2025-03-29 为什么强烈推荐 Intl.format 格式化时间?
- 2025-03-29 jdk8Date LocalDateTime类学习笔记
- 2025-03-29 11个Excel日期和时间函数,易学易用,简单高效
- 2025-03-29 Java格式化日期,时间(三种方法,建议收藏
- 2025-03-29 Excel日期和时间函数的实用技巧:提升效率,精准掌控
- 2025-03-29 SpringBoot 日期格式化的两种方式
- 2025-03-29 Linux,shell,时区,日期,时期格式化,随机数,代码案例
- 最近发表
- 标签列表
-
- xml (46)
- css animation (57)
- array_slice (60)
- htmlspecialchars (54)
- position: absolute (54)
- datediff函数 (47)
- array_pop (49)
- jsmap (52)
- toggleclass (43)
- console.time (63)
- .sql (41)
- ahref (40)
- js json.parse (59)
- html复选框 (60)
- css 透明 (44)
- css 颜色 (47)
- php replace (41)
- css nth-child (48)
- min-height (40)
- xml schema (44)
- css 最后一个元素 (46)
- location.origin (44)
- table border (49)
- html tr (40)
- video controls (49)