如何在 django-rest-framework 的序列化程序中使用时区序列化时间?

我有一个 Django 模型:


class Clinic(models.Model):


    NAME_MAX_LENGTH = 150

    name = models.CharField(max_length=NAME_MAX_LENGTH,blank=False,null=False)

    start_at = models.DateTimeField(blank=False,default=timezone.now)

客户端将 start_at 字段作为带有时区的时间字段发送


{

 start_at : "12:40:10+04:30"

我想将此时间字段转换为以当前日期为日期的 DateTimeField,然后将其作为时区感知 DateTimeField 保存到数据库中。


我想序列化此字段并从输入中提取时区信息,然后创建我的 DateTimeField 对象。我如何在 rest_framework 序列化程序中执行此操作?


胡说叔叔
浏览 114回答 1
1回答

隔江千里

您可以为此创建一个自定义序列化程序字段:import datetimefrom django.utils import timezonefrom rest_framework import serializersfrom rest_framework.fields import Fieldclass TimeWithTimezoneField(Field):    default_error_messages = {        'invalid': 'Time has wrong format, expecting %H:%M:%S%z.',    }    def __init__(self, *args, **kwargs):        super().__init__(*args, **kwargs)    def to_internal_value(self, value):        value_with_date = datetime.datetime.now().strftime('%Y-%m-%d') + ' ' + value        try:            parsed = datetime.datetime.strptime(value_with_date, '%Y-%m-%d %H:%M:%S%z')        except (ValueError, TypeError) as e:            pass        else:            return parsed        self.fail('invalid')    def to_representation(self, value):        if not value:            return None        if isinstance(value, str):            return value        return timezone.make_naive(value, timezone.utc).strftime("%H:%M:%S+00:00")class ClinicSerializer(serializers.ModelSerializer):    start_at = TimeWithTimezoneField()    class Meta:        model = Clinic        fields = [            'id',            'name',            'start_at',        ]对于您的示例,start_at: 12:40:10+04:30将存储为时区感知日期时间(UTC : 08:40:10+00:00)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python