Django Rest Framework에서 다른 시간대의 DateTime을 반환하는 방법

이것이 DRF에서 동적 시간대가 있는 DateTimes를 반환하는 방법입니다.

그래서 이번 주 초에 API에 대한 새 끝점을 만들어야 하는 새 티켓을 받았습니다. DRF가 있는 몇 가지 끝점은 큰 문제가 아니었습니다. 이 끝점의 응답에서 DateTime 값이 필요하다는 것을 깨달았을 때까지는 UTC에서 다른 시간대로 변환됩니다.

우리는 항상 DateTime 값을 UTC로 저장하고 반환하며 표시 시간에 사용자의 표준 시간대로 변환합니다. 이것은 JS를 사용하는 브라우저에서 가능합니다. 하지만 이번에는 달랐습니다. API는 특정 시간대의 값을 반환해야 했습니다.

우리는 이와 같은 것이 있습니다.


class Venue(models.Model):
    time_zone = models.CharField(max_length=128, default='UTC')
    ...

class Event(models.Model):
    start_time = models.DateTimeField()
    end_time = models.DateTimeField()
    venue = models.ForeignKey(Venue, on_delete=models.CASCADE)
    ...


각 이벤트는 장소에서 발생하며 이 장소는 일부 도시에 있으므로 해당 장소에 사용되는 시간대를 저장해야 합니다. 티켓을 판매하거나 일부 이벤트를 홍보하기를 원하기 때문에 고객과 다른 리셀러를 혼동하지 않도록 장소 시간대의 DateTime 값을 반환해야 합니다.

내가 생각한 첫 번째 솔루션은 직렬 변환기 필드 DateTimeField 이며 default_timezone 이라는 속성을 허용합니다. 이것은 시간대를 나타내는 pytz.timezone입니다. 지정되지 않고 USE_TZ 설정이 활성화된 경우 기본값은 현재 시간대입니다. USE_TZ이 비활성화되면 datetime 객체는 순진합니다.

class EventSerializer(serializers.ModelSerializer):
    start_time = serializers.DateTimeField(default_timezone=pytz.timezone('America/Bogota'))
    end_time = serializers.DateTimeField(default_timezone=pytz.timezone('America/Bogota'))
    ...


UTC의 start_time2021-09-02T10:00:00이면 결과 JSON이 2021-09-02T05:00:00-05:00으로 표시됩니다. 그러나 사전에 시간대를 알지 못하고 다를 것이기 때문에 저에게 적합하지 않았습니다. 따라서 런타임에 이 작업을 수행해야 했습니다. 내 솔루션은 직렬 변환기에서 to_representation() 메서드를 재정의하는 것이었습니다.

class EventSerializer(serializers.ModelSerializer):
    def to_representation(self, instance):
        self.fields['start_time'] = serializers.DateTimeField(default_timezone=pytz.timezone(instance.venue.time_zone))
        self.fields['end_time'] = serializers.DateTimeField(default_timezone=pytz.timezone(instance.venue.time_zone))
        return super().to_representation(instance)
    ...

to_representation은 직렬 변환기에 의해 반환될 각 인스턴스에 대해 실행되므로 기본적으로 우리가 하는 것은 각 인스턴스에 대해 start_timeend_time 선언을 재정의하는 것입니다. 이것은 DateTimeField을 사용하고 전달하려는 것을 지정하기 위한 것입니다 인스턴스에 연결된 장소에서 가져갈 default_timezone입니다.

이것은 내가 필요한 일을 하는 데 도움이 되었고 이것이 당신에게도 도움이 되기를 바랍니다.

저를 팔로우하고 GitHub에서 제 모든 프로젝트와 콘텐츠에 대한 최신 정보를 얻을 수 있습니다.

좋은 웹페이지 즐겨찾기