[장고] datetime 경고 메시지 발생 원인과 해결 방법
에러 메시지: RuntimeWarning: DateTimeField received a naive datetime.
이 메시지는 datetime 필드에 파이썬의 날짜 모듈인 datetime 객체가 입력되었을 때 발생하는 경고 메시지입니다.
문제 원인
settings.py에서 설정한 시간대(timezone)와 datetime 객체에 설정된 시간대가 달라 경고 메시지가 출력됩니다.
장고에서는 주로 timezone 객체를 사용하여 시간을 처리합니다. 그러나 파이썬의 날짜 객체도 사용할 수 있습니다. 시간대 설정은 중요하며, 서로 다른 설정이 충돌할 때 이 경고 메시지가 나타납니다. 아래 예제는 두 객체를 직접 호출했을 때의 결과입니다.
timezone:
>>> from django.utils import timezone
>>> timezone.now()
datetime.datetime(2024, 3, 1, 8, 12, 11, 174169, tzinfo=datetime.timezone.utc)
timezone.now() 메서드를 호출하면 tzinfo에 시간대가 설정되어 있음을 알 수 있습니다.
naive:
>>> from datetime import datetime
>>> datetime.now()
datetime.datetime(2024, 3, 1, 17, 10, 49, 861311) #년, 월, 일, 시, 분, 초, 마이크로초
반면 datetime.now() 메서드는 시간대가 설정되어 있지 않습니다.
해결 방법
경고 메시지를 없애는 방법은 두 가지입니다: timezone을 사용하거나 datetime을 사용하는 것입니다.
1. django가 지원하는 timezone 사용하기 (권장)
settings.py 파일에서 USE_TZ = True로 설정합니다.
# settings.py
USE_TZ = True
그리고 timezone 모듈만 사용합니다.
from django.utils import timezone
timezone.now()
2. naive datetime 객체 사용하기
경고를 무시하거나 naive datetime 객체를 사용하려면 settings.py에서 USE_TZ를 False로 설정합니다. USE_TZ를 False로 설정하면 로컬 시간을 사용하게 됩니다.
# settings.py
USE_TZ = False
또는 naive 날짜 객체에 현재 시간을 전달합니다.
from django.utils import timezone
import datetime
datetime.datetime.now(tz=timezone.utc)
이렇게 설정하면 경고 메시지를 피할 수 있습니다.