как сериализовать время с часовым поясом в сериализаторе django-rest-framework?

#python #django #datetime #django-rest-framework #django-timezone

#python #django #дата и время #django-rest-framework #django-timezone

Вопрос:

У меня есть модель Django:

 class Clinic(models.Model):

    NAME_MAX_LENGTH = 150
    name = models.CharField(max_length=NAME_MAX_LENGTH,blank=False,null=False)
    start_at = models.DateTimeField(blank=False,default=timezone.now)
  

клиент отправляет поле start_at в качестве поля времени с часовым поясом, например

 {
 start_at : "12:40:10 04:30"
} 
  

Я хочу преобразовать это поле времени в поле DateTimeField с текущей датой в качестве даты, а затем сохранить его в базе данных как DateTimeField с учетом часового пояса.

Я хочу сериализовать это поле и извлечь информацию о часовом поясе из входных данных, а затем создать свой объект DateTimeField. Как я могу это сделать в сериализаторе rest_framework?

Ответ №1:

Для этого вы можете создать пользовательское поле сериализатора :

 import datetime

from django.utils import timezone

from rest_framework import serializers
from rest_framework.fields import Field


class TimeWithTimezoneField(Field):

    default_error_messages = {
        'invalid': 'Time has wrong format, expecting %H:%M:%S%z.',
    }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    def to_internal_value(self, value):
        value_with_date = datetime.datetime.now().strftime('%Y-%m-%d')   ' '   value
        try:
            parsed = datetime.datetime.strptime(value_with_date, '%Y-%m-%d %H:%M:%S%z')
        except (ValueError, TypeError) as e:
            pass
        else:
            return parsed
        self.fail('invalid')

    def to_representation(self, value):
        if not value:
            return None

        if isinstance(value, str):
            return value

        return timezone.make_naive(value, timezone.utc).strftime("%H:%M:%S 00:00")


class ClinicSerializer(serializers.ModelSerializer):

    start_at = TimeWithTimezoneField()

    class Meta:
        model = Clinic
        fields = [
            'id',
            'name',
            'start_at',
        ]

  

В вашем примере start_at: 12:40:10 04:30 будет сохранена дата-время с учетом часового пояса (в UTC: 08:40:10 00:00 )