ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Django] model 내 DateTimeField 사용시 RuntimeWarning: DateTimeField received a naive datetime 에러
    언어/파이썬 & 장고 2016. 6. 25. 11:28

    장고에서 제공하는 모델을 사용하여 개발할 때, settings.py에 아래와 같이 설정이 되어 있을 것입니다.

    LANGUAGE_CODE = 'en-us'
    
    TIME_ZONE = 'Asia/Seoul'
    
    USE_I18N = True
    
    USE_L10N = True
    
    USE_TZ = True
    

    pgsql 테이블 내 컬럼 타입이 timestamp without time zone인 것을 테이블 스키마를 장고로 inspectdb를 할 시, DateTimeField로 정의가 됩니다.

    그리고 사용자는 해당 컬럼에 대해 datetime.now()와 같이 값을 넣을 때, 문제가 발생합니다.

    settings.py 에 정의 된 것처럼, timezone이 서울로 되어 입력이 되어야 하지만, 실제 들어간 데이터를 확인해 보면 UTC기준으로 입력이 됩니다. (또한 RuntimeWarning: DateTimeField received a naive datetime 와 같이 warning을 띄울 수 있습니다.)


    이러한 문제를 해결하기 위해, import datetime이 아닌 from django.conf import timezone을 사용하여 timezone.now()를 사용합니다. 또한 settings.py 의 USE_TZ = True부분을 USE_TZ = False로 변경합니다.

    이는 https://docs.djangoproject.com/en/1.9/ref/settings/#std:setting-USE_TZ 에 나와 있듯이 USE_TZ = True일경우, 장고 내부적으로 시간대를 인식하는 날짜 및 시간을 사용하고 USE_TZ = False일 경우, local time을 사용하게 됩니다. (확인이 필요한 부분이지만 True일 경우, UTC를 기준으로 사용하고 False일 경우, TIME_ZONE에 설정되어 있는 값을 참고하여 local time이 변형됩니다.)

    댓글