2017-10-26 8 views
0

私は、DateTimeFieldを持つDjango Rest Frameworkシリアライザを持っています。デフォルトでは、iso-8601形式を使用して日付/時刻値を逆シリアル化します。しかし、iso-8601はタイムゾーンオフセットを必要としません。私は、ユーザーがいつもタイムゾーンオフセット情報を提供する必要があります(または、より良いと言えば、iso-8601のサブセットである、もう一度rfc 3339を検証する)。Django Rest Framework DateTimeFieldにタイムゾーン情報を要求するにはどうすればよいですか?

フィールドではinput_formatsのカスタムリストを設定できますが、Pythonではrfc 3339の書式設定された日付を正しく解析できないため、時間と分の間のコロンのオフセットはサポートされません。

答えて

0

Django Rest FrameworkのDateTimeFieldは、django.utils.dateparse.parse_datetimeの使用により、rfc 3339 datetime値を完全に解析することができます(それはやや寛大ですが、問題ありません)。

parse_datetimeは、タイムゾーン対応のdatetimeインスタンス(固定オフセットにtzinfo zetを使用)または単純なdatetimeインスタンス(tzinfoなし)を戻します。

settings.USE_TZが設定されているか、フィールドにdefault_timezone引数の値が指定されている場合、Django Rest FrameworkのDateTimeFieldは任意の値を認識日時値に変換します。そうでない場合は、値はナイーブになります。

DateTimeFieldのenforce_timezoneメソッドは、値を認識しやすくするために使用します。 、値が解析され施行がenforce_timezoneをオーバーライドし、解析された日時の値がナイーブである場合ValidationErrorを上昇させることによって達成することができる認識タイムゾーンする必要があり、これを知る

from django.utils import timezone 

class DateTimeFieldWithOffset(serializers.DateTimeField): 
    default_error_messages = { 
     'naive': 'Datetime value is missing a timezone offset.' 
    } 

    def enforce_timezone(self, value): 
     if timezone.is_naive(value): 
      self.fail('naive') 
     return super().enforce_timezone(value) 
関連する問題