Можно ли использовать DRF's datetimepicker и включить смещение UTC для временных меток в ответный JSON?
Я пытаюсь использовать веб-интерфейс API для просмотра в Django Rest Framework. У меня есть объекты с данными временных меток в таком формате: "2025-05-08T22:02:58.869000-07:00". Но требуемый формат для datetimepicker в Django не поддерживает смещение UTC или последние три значащие цифры в микросекундах, как показано ниже:
Я могу обрезать входные данные, чтобы они соответствовали параметру выбора даты и времени, следующим образом:
class MillisecondDateTimeField(serializers.DateTimeField):
def to_representation(self, value):
return value.astimezone().strftime("%Y-%m-%dT%H:%M:%S") + ".{:03d}".format(
int(value.microsecond / 1000)
)
Но тогда смещение UTC также отсутствует в метке времени в ответе POST/PUT.
{
...
"start_datetime": "2025-05-08T22:02:58.869",
...
}
Как я могу сделать так, чтобы значение "start_datetime" отображалось как "2025-05-08T22:02:58.869000-07:00" в ответе JSON от POST/PUT, а также использовать "2025-05-08T22:02:58.869" в окне выбора даты и времени? Я уже несколько дней занимаюсь поисками в Интернете и пытаюсь это сделать.
Если вы хотите принять простой ввод, например "2025-05-08T22:02:58.869". Но верните полную строку ISO 8601 с указанием часового пояса в ответе API (например, "2025-05-08T22:02:58.869000-07:00"). Вы можете использовать пользовательское поле сериализатора. Я рекомендую ознакомиться со следующим Руководством DRF API по переопределению поведения сериализации и десериализации
import pytz
from rest_framework import serializers
from datetime import datetime
class CustomDateTimeFieldSerializer(serializers.DateTimeField):
def to_representation(self, value):
# Return full ISO 8601 string with offset
return value.isoformat()
def to_internal_value(self, value):
if isinstance(value, datetime):
return value
if isinstance(value, str):
try:
# Accept format from datetime picker (no timezone)
dt = datetime.strptime(value, "%Y-%m-%dT%H:%M:%S.%f")
return pytz.UTC.localize(dt) # or your preferred timezone
except ValueError:
pass
return super().to_internal_value(value)
# Use It in Your Serializer
class Serializer(serializers.ModelSerializer):
start_datetime = CustomDateTimeFieldSerializer()
class Meta:
model = Model
fields = '__all__'
