从序列化程序中的 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.DateTimeFielddjango-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中使用它,你需要按照以下步骤

  1. 创建一个继承自 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,
    }
  1. 使用 CustomModelSerializer 而不是 serializers.ModelSerializer。例如
class LogSerializer(CustomModelSerializer):
    class Meta:
        model = Log
        fields = ["id", "created_at"]