Django Rest Framework에서 다른 시간대의 DateTime을 반환하는 방법
6435 단어 pythondjangowebdevprogramming
그래서 이번 주 초에 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_time
이 2021-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_time
및 end_time
선언을 재정의하는 것입니다. 이것은 DateTimeField
을 사용하고 전달하려는 것을 지정하기 위한 것입니다 인스턴스에 연결된 장소에서 가져갈 default_timezone
입니다.이것은 내가 필요한 일을 하는 데 도움이 되었고 이것이 당신에게도 도움이 되기를 바랍니다.
저를 팔로우하고 GitHub에서 제 모든 프로젝트와 콘텐츠에 대한 최신 정보를 얻을 수 있습니다.
Reference
이 문제에 관하여(Django Rest Framework에서 다른 시간대의 DateTime을 반환하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/juanbenitezdev/how-to-return-datetime-in-different-time-zones-from-django-rest-framework-1396텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)