Подтвердить что ты не робот

Средства рендеринга/парсеров, поддерживающие пояснительные записи Django-rest-framework

Я создаю приложение, которое будет обслуживать людей, расположенных в разных местах во всем мире.
Я использую Django-Rest-Framwork для связи между клиентами и сервером.
Все значения DateTime сохраняются в DB как UTC (у меня есть USE_TZ = True и TIME_ZONE = 'Greenwich' в settings.py).

Я получаю от пользователя его часовой пояс.

В test 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, а затем сохраняется к БД. Однако они сохраняются , как если бы они были в формате UTC.

В этот момент я ожидал, что сериализатор (или синтаксический анализатор) будет обрабатывать ввод данных datetime от пользователя как datetime, который нужно преобразовать из "Азия/Иерусалим" в UTC перед сохранением в БД, так как я выполнил timezone.activate(pytz.timezone("Asia/Jerusalem")).

То же самое происходит, когда данные анализируются в ответ через JSONParser.
Ожидая, что поля DateTime в возвращенном JSON будут в часовом поясе, активированные в промежуточном программном обеспечении, они возвращаются в формате UTC.

Как я могу легко достичь этого в DRF?

4b9b3361

Ответ 1

У меня была та же проблема и она была решена путем добавления нового типа поля:

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',
        )

Ответ 2

Ответ на @yakxxx представляется лучшим решением. Я отправляю его снова после обновления его для работы с новыми версиями restframework

внутри моего каталога (common/serializers.py)

from rest_framework import serializers
from django.utils import timezone

class DateTimeFieldWihTZ(serializers.DateTimeField):

    def to_representation(self, value):
        value = timezone.localtime(value)
        return super(DateTimeFieldWihTZ, self).to_representation(value)

Внутри приложения

from common.serializers import DateTimeFieldWihTZ

class MyObjectSerializer(serializers.ModelSerializer):

    start = DateTimeFieldWihTZ(format='%d %b %Y %I:%M %p')
    end = DateTimeFieldWihTZ(format='%d %b %Y %I:%M %p')