RuntimeWarning: DateTimeField ने एक भोली डेटाइम प्राप्त की


309

मैं IPython का उपयोग करके एक साधारण मेल भेजने की कोशिश कर रहा हूं। मैंने अभी तक इस त्रुटि को प्राप्त करने वाले किसी भी मॉडल को स्थापित नहीं किया है। क्या किया जा सकता है?

त्रुटि: / home/sourabh/Django/learn/local/python2.7/site-packages/django/db/models/fields/ init .py: 827: RuntimeWarning: DateTimeField को एक भोला-भाला प्राप्त हुआ (2013-09-04)। 14: 14: 13.698105) जबकि समय क्षेत्र सक्रिय है। RuntimeWarning)

कोशिश की: पहला कदम 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)

जवाबों:


487

समस्या Django सेटिंग में नहीं है, लेकिन मॉडल को दी गई तारीख में । यहां बताया गया है कि टाइमजोन-जागरूक वस्तु कैसे दिखती है:

>>> 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 का उपयोग करें now()। यदि नहीं, तो यह संभवतः एक मौजूदा पैकेज के साथ एक समस्या है जो समय-सीमा के बिना तारीख लेती है और आप पैकेज को पैच कर सकते हैं, चेतावनी को अनदेखा कर सकते हैं या गलत पर USE_TZ सेट कर सकते हैं।


8
आप कहाँ लिखते हैं tzinfo=<UTC>, क्या है <UTC>? यह एक वाक्यात्मक निर्माण नहीं है जिसे मैंने देखा है।
jameshfisher

4
पार्टी के लिए थोड़ा देर से, लेकिन आप जो देख रहे हैं वह शेल से आउटपुट है। अधिक विशेष रूप से, यह डेटाटाइम ऑब्जेक्ट के repr विधि से आउटपुट है, जो ऑब्जेक्ट की प्रिंट करने योग्य जानकारी देता है।
जॉर्ज ग्रिफिन

36
उन जगहों पर जहां आप उपयोग कर रहे थे datetime.now, इसे बदलकर शीर्ष पर timezone.nowजोड़ें from django.utils import timezone
अनूटी

12
उन लोगों के लिए जो अभी भी उस <UTC> भाग की तलाश में हैं, आप इसका उपयोग कर सकते हैं:import pytz datetime.datetime(2013, 11, 20, 20, 8, 7, 127325, tzinfo=pytz.UTC)
Anoyz

मेरी सेटिंग्स हैं USE_TZ = True, TIME_ZONE = 'UTC'। लेकिन जब मैं इसका उपयोग timezone.now()करता हूं tzinfo=<UTC>तो यह नहीं दिखाता है .... इसलिए इस डेटाटाइम ऑब्जेक्ट को भोले के रूप में पारित किया जाता है। क्यों होता है?
user3595632

71

का प्रयोग करें django.utils.timezone.make_aware अपने अनुभवहीन datetime वस्तुओं के बारे में पता समयक्षेत्र बनाने के लिए और उन चेतावनियों से बचने के लिए कार्य करते हैं।

यह भोली डेटाइम ऑब्जेक्ट (टाइमज़ोन जानकारी के बिना) को उस समय परिवर्तित करता है, जिसमें टाइमज़ोन जानकारी है (यदि आप इसे दूसरे तर्क के रूप में स्पष्ट रूप से निर्दिष्ट नहीं करते हैं, तो आपके डीजंगो सेटिंग्स में निर्दिष्ट टाइमज़ोन का उपयोग करना):

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>

इस उत्तर के लिए धन्यवाद, यह मेरे django सेटिंग्स के समयक्षेत्र के साथ दिनांक में भोली तारीखों को बदलने के लिए सबसे django- अनुरूप तरीका है :)
sodimel

क्या इसे मॉडल थिंकपैड में रखना संभव है?
फ्लोरेंट

@ किसी भी मॉडल में कुछ भी बदलने की आवश्यकता नहीं है यदि आप डिफ़ॉल्ट रूप से utc timezone का उपयोग करते हैं , auto_nowऔर डेटाइम क्षेत्रों के auto_now_addलिए ठीक काम करेंगे। यदि आपको किसी कारण से मॉडल में टाइमज़ोन के बारे में पता है कि वर्तमान डेटाटाइम ऑब्जेक्ट की आवश्यकता है - django.utils.timezone.now()फ़ंक्शन का उपयोग करें।
dmrz

26

बस वर्तमान समय सेट करने के लिए त्रुटि को ठीक करने के लिए

from django.utils import timezone
import datetime

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

4
और डेटाटाइम के लिए। जीवनकाल (9999, 01, 01, tzinfo = timezone.utc)
I. येगोर

IMO यह सबसे व्यावहारिक उपाय है
रामतिन

9

कोई भी चेतावनी को ठीक कर सकता है और settings.py में निर्दिष्ट टाइमज़ोन का उपयोग कर सकता है, जो UTC से भिन्न हो सकता है।

उदाहरण के लिए मेरी सेटिंग्स में मेरे पास है:

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_aware, dmrz पोस्ट देखें।


5

त्वरित और गंदा - इसे बंद करें:

USE_TZ = False

अपने में settings.py


1
जब USE_TZ यह सच है और डेटाबेस समय क्षेत्रों (जैसे PostgreSQL) का समर्थन करता है, यह इस विकल्प को सेट करने के लिए एक त्रुटि है docs.djangoproject.com/en/2.2/ref/settings/#time-zone
Marcaum54

3

आप सेटिंग को ओवरराइड भी कर सकते हैं, विशेष रूप से परीक्षणों में उपयोगी:

from django.test import override_settings

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

यह आपको चेतावनी को देखने से रोकेगा, साथ ही आपके कोड में कुछ भी जो टाइमजोन जागरूक डेटटाइम की आवश्यकता है, आपको समस्याएं दे सकता है। यदि यह मामला है, तो kravietz जवाब देखें।


2

यदि आप एक भोले-भाले व्यक्ति को डेटंजो में टाइमज़ोन के साथ एक डेटाइम में बदलने की कोशिश कर रहे हैं, तो यहां मेरा समाधान है:

>>> 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 की सेटिंग में टाइमज़ोन के साथ एक डेटाटाइम है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.