-
Django 에서 String datetime 을 aware 한 datetime 으로 변경하는 방법기술/Django 2021. 9. 24. 19:16
REST API 를 사용하다보면 프론트에서 datetime 정보를 받을 때가 있습니다.
API 로 받았기 때문에 해당 정보는 String 형태를 가지고 있습니다.
이를 Python 의 datetime 형태로 바꾸는 방법이 여럿 있겠지만 django 에서 지원해주는 util 이 있어 소개해드리고자 합니다.
시작하기 전, 사전 지식
navie vs aware
- naive datetime: timezone 정보를 포함하지 않는 datetime
- aware datetime: timezone 정보를 포함하는 datetime
python 내장 datetime 를 가지고 ORM 필터를 할 때
"naive dateimte 을 aware 하게 바꿔주세요" 하며 Warning 으로 콘솔에 찍힐 때가 있습니다.
DB 는 timezone 을 가지고 수행되므로 aware datetime 을 가지고 사용했을 때
사용자가 예측가능한 결과를 가져올 수 있기 때문에 친절하게 Warning Message 를 띄워주는 것 같습니다.
django.utils.dateparse
https://django.readthedocs.io/en/stable/ref/utils.html#module-django.utils.dateparse
django 의 dateparse 모듈을 사용하면 문자열을 간단하게 django 에서 date 와 관련하여 간단하게 사용할 수 있도록 도와줍니다.
from datetime import datetime from django.utils.dateparse import parse_datetime now = datetime.now() # datetime.datetime(2020, 9, 21, 16, 12, 10, 25816) parsed_now = parse_datetime(str(now)) # datetime.datetime(2020, 9, 21, 16, 12, 10, 25816) # 출력해보면 달라진 것이 없는 것처럼 보이지만 timezone 정보가 붙었습니다. # 달라진 정보를 보기위해서는 astimezone() 메서드를 사용해야합니다. print(parsed_now.astimezone()) # datetime.datetime(2020, 9, 21, 16, 12, 10, 25816, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400), 'KST'))
이후 parse_datetime 로 생성된 datetime 을 Warning 없이 django ORM 에서 사용할 수 있습니다.
이외에도 parse_date, parse_duration 같은 유용한 유틸이 있습니다.
'기술 > Django' 카테고리의 다른 글
Django 에서 일시적으로 auto_now, auto_now_add 를 disable 시키는 법 (0) 2021.09.24 Django Filters 에서 하나의 Key를 가지고 여러 값 필터하기 ( MultipleFilter ) (0) 2021.09.24 Django 에서 Chain 필터 시 추가적인 테이블 JOIN 방지하기 ( + _next_is_sticky ) (0) 2021.09.24 Django Manager, Queryset (1) 2021.09.24 Django 에서 Annotate 와 Union 을 함께 사용할 때 생기는 문제 (0) 2021.09.24