Как получить Django Rest Framework DateTimeField для запроса информации о часовом поясе?

У меня есть сериализатор Django Rest Framework с DateTimeField. По умолчанию он десериализует значения даты / времени в формате iso-8601. Однако iso-8601 не требует смещения часового пояса. Мне нужно, чтобы пользователь всегда предоставлял некоторую информацию о смещении часового пояса (или, точнее, подтвердил еще раз RFC 3339, подмножество iso-8601).

Поле позволяет вам установить пользовательский список input_formats, но так как Python не может правильно проанализировать даты, отформатированные в rfc 3339 (т.е. смещение с двоеточием между часовой и минутной частями не поддерживается), я застрял.

1 ответ

Решение

DateTimeField в Django Rest Framework вполне способен анализировать значения datetime rfc 3339 благодаря использованию django.utils.dateparse.parse_datetime (это несколько мягче, но это нормально).

parse_datetime либо возвращает экземпляр datetime с учетом часового пояса (с фиксированным смещением tzinfo zet), либо простой экземпляр datetime (без tzinfo).

DateTimeField Django Rest Framework преобразует любое заданное значение в известное значение даты и времени, если settings.USE_TZ или поле было присвоено значение для default_timezone аргумент, в противном случае любое значение считается наивным.

enforce_timezone Метод DateTimeField отвечает за то, чтобы сделать значения осведомленными / наивными.

Зная это, обеспечение того, что проанализированные значения должны учитывать часовой пояс, может быть достигнуто путем переопределения 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)
Другие вопросы по тегам