[django] RuntimeWarning : DateTimeField가 순진한 datetime을 받았습니다

IPython을 사용하여 간단한 메일을 보내려고합니다. 이 오류가 계속 발생하는 모델을 설정하지 않았습니다. 무엇을 할 수 있습니까?

오류 : /home/sourabh/Django/learn/local/lib/python2.7/site-packages/django/db/models/fields/ init .py : 827 : RuntimeWarning : DateTimeField가 순진한 날짜 시간을 받았습니다 (2013-09-04 시간대 지원이 활성화 된 동안 14 : 14 : 13.698105). 런타임 경고)

시도 : 첫 번째 단계는 USE_TZ = True설정 파일 에 추가 하고 pytz가능한 경우 설치하는 것 입니다.

오류가 변경되었습니다 :

(learn)sourabh@sL:~/Django/learn/event$ python manage.py shell
/home/sourabh/Django/learn/local/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py:53: RuntimeWarning: SQLite received a naive datetime (2013-09-05 00:59:32.181872) while time zone support is active.
  RuntimeWarning)



답변

문제는 장고 설정이 아니라 모델에 전달 된 날짜 에 있습니다. 시간대 인식 객체의 모양은 다음과 같습니다.

>>> from django.utils import timezone
>>> import pytz
>>> timezone.now()
datetime.datetime(2013, 11, 20, 20, 8, 7, 127325, tzinfo=pytz.UTC)

그리고 순진한 대상이 있습니다.

>>> from datetime import datetime
>>> datetime.now()
datetime.datetime(2013, 11, 20, 20, 9, 26, 423063)

따라서 이메일 날짜를 어디에서나 전달하면 (그리고 결국 일부 모델에 도달하면) Django ‘s를 사용하십시오 now(). 그렇지 않은 경우 시간대없이 날짜를 가져 오는 기존 패키지의 문제 일 수 있으며 패키지를 패치하거나 경고를 무시하거나 USE_TZ를 False로 설정할 수 있습니다.


답변

순진한 datetime 객체를 표준 시간대로 인식하고 이러한 경고를 피 하려면 django.utils.timezone.make_aware 함수를 사용하십시오.

시간대 정보가없는 순진한 날짜 시간 객체를 시간대 정보가있는 객체로 변환합니다 (두 번째 인수로 명시 적으로 지정하지 않으면 django 설정에 지정된 시간대 사용).

import datetime
from django.conf import settings
from django.utils.timezone import make_aware

naive_datetime = datetime.datetime.now()
naive_datetime.tzinfo  # None

settings.TIME_ZONE  # 'UTC'
aware_datetime = make_aware(naive_datetime)
aware_datetime.tzinfo  # <UTC>


답변

현재 시간을 설정하기 위해 오류를 수정하기 만하면됩니다.

from django.utils import timezone
import datetime

datetime.datetime.now(tz=timezone.utc) # you can use this value


답변

하나는 모두 수정 경고 수 UTC 다를 수 있습니다 settings.py에 지정된 시간대를 사용합니다.

예를 들어 내 settings.py에서 나는 :

USE_TZ = True
TIME_ZONE = 'Europe/Paris'

해결책은 다음과 같습니다. 장점은 str(mydate)올바른 시간 을 제공 한다는 것입니다 .

>>> from datetime import datetime
>>> from django.utils.timezone import get_current_timezone
>>> mydate = datetime.now(tz=get_current_timezone())
>>> mydate
datetime.datetime(2019, 3, 10, 11, 16, 9, 184106,
    tzinfo=<DstTzInfo 'Europe/Paris' CET+1:00:00 STD>)
>>> str(mydate)
'2019-03-10 11:16:09.184106+01:00'

다른 동등한 방법은을 사용하는 것입니다 ( make_awaredmrz post 참조).


답변

빠르고 더러움-끄기 :

USE_TZ = False

당신의 settings.py


답변

특히 테스트에 유용한 설정을 무시할 수도 있습니다.

from django.test import override_settings

with override_settings(USE_TZ=False):
    # Insert your code that causes the warning here
    pass

이렇게하면 시간대 인식 날짜 / 시간이 필요한 코드에서 문제가 발생할 수있는 경고가 표시되지 않습니다. 이 경우 kravietz 답변을 참조하십시오.


답변

장고의 시간대를 사용하여 순진한 날짜 시간을 날짜 시간으로 변환하려고하면 내 해결책이 있습니다.

>>> import datetime
>>> from django.utils import timezone
>>> t1 = datetime.datetime.strptime("2019-07-16 22:24:00", "%Y-%m-%d %H:%M:%S")
>>> t1
    datetime.datetime(2019, 7, 16, 22, 24)
>>> current_tz = timezone.get_current_timezone()
>>> t2 = current_tz.localize(t1)
>>> t2
    datetime.datetime(2019, 7, 16, 22, 24, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)
>>>

t1은 순진한 날짜 시간이고 t2는 django 설정에서 시간대가있는 날짜 시간입니다.