Обработка ошибочного входящего смещения даты-времени ISO8601 с помощью Django Rest Framework - PullRequest
1 голос
/ 03 мая 2019

Мой мобильный клиент отправляет неточную информацию о смещении даты и времени. Например:

2019-05-03T17:55:12-0700

Время на самом деле является правильным временем UTC, однако смещение должно быть равно -0000.

В настоящее время я не могу изменить клиента, чтобы устранить проблему, вызвавшую это. Поэтому мне нужно выбросить смещение или изменить его на -0000.

В приведенном выше примере для этого пользователя, для которого в качестве настройки часового пояса для аккаунта установлено значение PST, он сохраняет дату в validated_data как datetime.datetime(2019, 5, 4, 0, 55, 12, tzinfo=<UTC>)

Если бы информация о времени и смещении на основе клиента была синхронизирована, это преобразование с помощью DRF было бы правильным, так как это семь часов перерыва или PST + текущее DST. (Западное побережье США в настоящее время -7: 00 UTC)

Проблема в том, что к тому времени, когда я достигну своего класса ModelSerializer, validated_data уже содержит то, что, по мнению DRF, теперь является правильным временем UTC.

Где находится подходящее место для изменения этого поля в теле POST, чтобы к моменту, когда DRF попытался создать DateTime, он построил правильную временную метку?

1 Ответ

0 голосов
/ 04 мая 2019

Самый простой способ справиться с этим - изменить объект DateTime перед его сохранением в поле модели. Таким образом, в create() получите исходную строку ISO8601 из тела POST, используя self.context['request'].data['created']. Затем используйте dateutil.parser для анализа строки в DateTime и замените часовой пояс на pytz.UTC.

import dateutil.parser

Class MySerializer(serializers.ModelSerializer):

...

    def create(self, validated_data):
         scan.created = dateutil.parser.parse(self.context['request'].data['created']).replace(tzinfo=pytz.UTC)

Это не великолепное исправление, но оно будет работать, пока я не смогу выпустить обновленный мобильный клиент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...