22

世界中のさまざまな場所にいる人々に役立つアプリを構築しています。
クライアントとサーバー間の通信に Django-Rest-Framwork を使用しています。
すべての DateTime 値は UTC として DB に保存されます (私はsettings.py にUSE_TZ = TrueありTIME_ZONE = 'Greenwich'ます)。

ユーザーのローカルタイムゾーンから取得します。

タイムゾーン認識について DRFをテストするために、固定タイムゾーンで次のミドルウェアを作成しました。

import pytz
from django.utils import timezone

class TimezoneMiddleware(object):
    def process_request(self, request):
        timezone.activate(pytz.timezone("Asia/Jerusalem"))

問題は次のとおり
です。ユーザーの「start_time」および「end_time」フィールドから、ユーザーのLOCALタイムゾーンの日時を取得してUnicodeJSONRendererから取得ModelSerializerし、DB に保存する場合があります。ただし、それらはUTC であるかのように保存されます。

この時点で、シリアライザー (またはパーサー) がユーザーからの日時入力を日時として処理することを期待しますtimezone.activate(pytz.timezone("Asia/Jerusalem")).

を介して応答でデータが解析される場合も同様JSONParserです。
返された JSON の DateTime フィールドは、ミドルウェアでアクティブ化されたタイムゾーンにあると予想されますが、UTC として返されます。

DRFでそれを簡単に達成するにはどうすればよいですか?

4

3 に答える 3

35

私は同じ問題を抱えていて、新しいタイプのフィールドを追加して解決しました:

class DateTimeTzAwareField(serializers.DateTimeField):

    def to_native(self, value):
        value = timezone.localtime(value)
        return super(DateTimeTzAwareField, self).to_native(value)

そして今、あなたはそれを使用することができますModelSerializer:

class XSerializer(serializers.ModelSerializer):
    start = DateTimeTzAwareField()
    end = DateTimeTzAwareField()

    class Meta:
        model = XModel
        fields = (
             'id',
             'start',
             'end',
        )
于 2013-09-03T23:10:30.583 に答える