从序列化程序中的 DateTimeField 中删除 Z
Remove Z from DateTimeField in serializer
有没有办法让我的序列化程序像这样默认打印日期时间字段
2022-03-28T00:00:00+00:00
而不是这个
2022-03-23T03:16:00Z
执行此操作时我得到第一个输出
return obj.time.isoformat()
最简单的方法是在序列化程序中指定您想要的格式:
class MySerializer(serializer.Serializer):
my_date = serializers.DateTimeField(format='%Y-%m-%dT%H:%M') # Specify your format here
原因
如果您查看 serializers.DateTimeField
中 django-rest-framework
的代码,如果 datetime 是 UTC 时区,UTC 偏移量 (+00:00
) 将被转换为 Z
可见 here
解决方案
如果你想让它对DateTimeField
重用,你需要创建一个继承自serializers.DateTimeField
的自定义序列化程序DateTimeField
,并通过复制覆盖to_representation
方法django-rest-framework
中的代码并删除将 UTC 偏移字符串转换为 Z
.
的行
from restframework import ISO_8601
from restframework import serializers
class CustomDateTimeField(serializers.DateTimeField):
def to_representation(self, value):
if not value:
return None
output_format = getattr(self, 'format', api_settings.DATETIME_FORMAT)
if output_format is None or isinstance(value, str):
return value
value = self.enforce_timezone(value)
if output_format.lower() == ISO_8601:
value = value.isoformat()
# remove lines that convert "+00:00" to "Z"
# See https://github.com/encode/django-rest-framework/blob/f4cf0260bf3c9323e798325702be690ca25949ca/rest_framework/fields.py#L1239:L1240
return value
return value.strftime(output_format)
然后在你的序列化程序中使用它而不是 serializers.DateTimeField
class MySerializer(serializers.Serializer):
datetime = CustomDateTimeField()
额外
如果你想在serializers.ModelSerializer
中使用它,你需要按照以下步骤
- 创建一个继承自
serializers.ModelSerializer
的自定义 ModelSerializer
并设置 serializer_field_mapping
属性如下
class CustomModelSerializer(serializers.ModelSerializer):
serializer_field_mapping = {
# copy serializer_field_mapping
**serializers.ModelSerializer.serializer_field_mapping,
# override models.DateTimeField to map to CustomDateTimeField
models.DateTimeField: CustomDateTimeField,
}
- 使用
CustomModelSerializer
而不是 serializers.ModelSerializer
。例如
class LogSerializer(CustomModelSerializer):
class Meta:
model = Log
fields = ["id", "created_at"]
有没有办法让我的序列化程序像这样默认打印日期时间字段
2022-03-28T00:00:00+00:00
而不是这个
2022-03-23T03:16:00Z
执行此操作时我得到第一个输出
return obj.time.isoformat()
最简单的方法是在序列化程序中指定您想要的格式:
class MySerializer(serializer.Serializer):
my_date = serializers.DateTimeField(format='%Y-%m-%dT%H:%M') # Specify your format here
原因
如果您查看 serializers.DateTimeField
中 django-rest-framework
的代码,如果 datetime 是 UTC 时区,UTC 偏移量 (+00:00
) 将被转换为 Z
可见 here
解决方案
如果你想让它对DateTimeField
重用,你需要创建一个继承自serializers.DateTimeField
的自定义序列化程序DateTimeField
,并通过复制覆盖to_representation
方法django-rest-framework
中的代码并删除将 UTC 偏移字符串转换为 Z
.
from restframework import ISO_8601
from restframework import serializers
class CustomDateTimeField(serializers.DateTimeField):
def to_representation(self, value):
if not value:
return None
output_format = getattr(self, 'format', api_settings.DATETIME_FORMAT)
if output_format is None or isinstance(value, str):
return value
value = self.enforce_timezone(value)
if output_format.lower() == ISO_8601:
value = value.isoformat()
# remove lines that convert "+00:00" to "Z"
# See https://github.com/encode/django-rest-framework/blob/f4cf0260bf3c9323e798325702be690ca25949ca/rest_framework/fields.py#L1239:L1240
return value
return value.strftime(output_format)
然后在你的序列化程序中使用它而不是 serializers.DateTimeField
class MySerializer(serializers.Serializer):
datetime = CustomDateTimeField()
额外
如果你想在serializers.ModelSerializer
中使用它,你需要按照以下步骤
- 创建一个继承自
serializers.ModelSerializer
的自定义ModelSerializer
并设置serializer_field_mapping
属性如下
class CustomModelSerializer(serializers.ModelSerializer):
serializer_field_mapping = {
# copy serializer_field_mapping
**serializers.ModelSerializer.serializer_field_mapping,
# override models.DateTimeField to map to CustomDateTimeField
models.DateTimeField: CustomDateTimeField,
}
- 使用
CustomModelSerializer
而不是serializers.ModelSerializer
。例如
class LogSerializer(CustomModelSerializer):
class Meta:
model = Log
fields = ["id", "created_at"]