[장고] datetime 경고 메시지 발생 원인과 해결 방법

소요 시간: 1분

에러 메시지: 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)

이렇게 설정하면 경고 메시지를 피할 수 있습니다.

장고 리스트