Как получить 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)