-
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 Utils — Django 3.2.7 documentation
This document covers all stable modules in django.utils. Most of the modules in django.utils are designed for internal use and only the following parts can be considered stable and thus backwards compatible as per the internal release deprecation policy. d
django.readthedocs.io
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