从序列化器中的 DateTimeField 中删除 Z

发布于 2025-01-16 19:05:54 字数 203 浏览 1 评论 0原文

有没有办法让我的序列化器默认打印日期时间字段,

 2022-03-28T00:00:00+00:00

所示

 2022-03-23T03:16:00Z 

如下

return obj.time.isoformat()

Is there a way to make my serializer print the datetimefield by default like this

 2022-03-28T00:00:00+00:00

Instead of this

 2022-03-23T03:16:00Z 

I get the first output when I do this

return obj.time.isoformat()

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

寒尘 2025-01-23 19:05:54

原因

如果您查看 serializers.DateTimeField 中的 django-rest-framework 代码,如果日期时间是 UTC 时区,则 UTC 偏移量 (+00:00 code>) 将被转换为 Z ,可以看出 此处

解决方案

如果您想要使其可重复使用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()

Extra

如果您想在 serializers.ModelSerializer 中使用它,您需要按照以下步骤

  1. 创建自定义 ModelSerializer 继承自 serializers.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"]

Cause

If you look into the code of django-rest-framework in serializers.DateTimeField if datetime is UTC timezone, the UTC offset (+00:00) will get converted to Z as can be seen here

Solution

If you want to make it reusable for DateTimeField, you need to create a custom serializer DateTimeField that inherits from serializers.DateTimeField and override the to_representation method by coping codes from django-rest-framework and removing lines that convert UTC offset string to 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)

Then use this in your serializer instead of serializers.DateTimeField

class MySerializer(serializers.Serializer):
    datetime = CustomDateTimeField()

Extra

If you want to use it in serializers.ModelSerializer, you need to follow below steps

  1. Create a custom ModelSerializer that inherits from serializers.ModelSerializer and set serializer_field_mapping attribute as follows
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. Use CustomModelSerializer instead of serializers.ModelSerializer. E.g.
class LogSerializer(CustomModelSerializer):
    class Meta:
        model = Log
        fields = ["id", "created_at"]
淡墨 2025-01-23 19:05:54

最简单的方法是在序列化器中指定所需的格式:

class MySerializer(serializer.Serializer):

    my_date = serializers.DateTimeField(format='%Y-%m-%dT%H:%M')  # Specify your format here

The simplest way to do it is to specify the format you want in your serializer:

class MySerializer(serializer.Serializer):

    my_date = serializers.DateTimeField(format='%Y-%m-%dT%H:%M')  # Specify your format here
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文