[英]how to serialize time with timezone in django-rest-framework's serializer?
I have a Django model:我有一个 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)
the client sends the start_at field as a time field with timezone like客户端将 start_at 字段作为具有时区的时间字段发送,例如
{
start_at : "12:40:10+04:30"
}
I want to convert this time field into the DateTimeField with the current date as the date and then save it into the database as a timezone-aware DateTimeField.我想将此时间字段转换为以当前日期为日期的 DateTimeField,然后将其作为时区感知 DateTimeField 保存到数据库中。
I want to serialize this field and extract timezone info from the input and then create my DateTimeField object.我想序列化这个字段并从输入中提取时区信息,然后创建我的 DateTimeField 对象。 How can I do this in rest_framework serializer?
如何在 rest_framework 序列化程序中执行此操作?
You can create a custom serializer field for this :您可以为此创建自定义序列化程序字段:
import datetime
from django.utils import timezone
from rest_framework import serializers
from rest_framework.fields import Field
class 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',
]
With your example, start_at: 12:40:10+04:30
will be stored as a timezone aware datetime (in UTC : 08:40:10+00:00
)在您的示例中,
start_at: 12:40:10+04:30
将存储为时区感知日期时间(在 UTC 中: 08:40:10+00:00
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.