django-rest-frameworkのシリアライザーでタイムゾーンを使用して時間をシリアル化する方法は?
Aug 24 2020
私は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シリアライザーでこれを行うにはどうすればよいですか?
回答
2 Charlesthk Aug 23 2020 at 23:50
このためのカスタムシリアライザーフィールドを作成できます:
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',
]
あなたの例では、start_at: 12:40:10+04:30
(UTCに:タイムゾーンを意識日時として保存されます08:40:10+00:00
)