রানটাইম ওয়ার্নিং: ডেটটাইমফিল্ড একটি নিষ্পাপ ডেটটাইম পেয়েছে


309

আমি আইপিথন ব্যবহার করে একটি সাধারণ মেল প্রেরণের চেষ্টা করছি। এখনও এই ত্রুটিটি পেয়ে আমি কোনও মডেল সেট আপ করি নি। কি করা যেতে পারে?

ত্রুটি: /home/sourabh/Django/learn/local/lib/python2.7/site-packages/django/db/models/fields/ Init .py: 827: RuntimeWarning: DateTimeField একটি সাদাসিধা DATETIME পেয়েছি (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

সমস্যা জাঙ্গো সেটিংসে নয়, মডেলটির পাসের তারিখে । টাইমজোন-সচেতন অবজেক্টটি কেমন দেখাচ্ছে তা এখানে:

>>> 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)

সুতরাং আপনি যদি ইমেলের তারিখটি কোথাও পাস করে থাকেন (এবং এটি শেষ পর্যন্ত কোনও মডেলের কাছে পৌঁছে) তবে কেবল জ্যাঙ্গোর ব্যবহার করুন now()। যদি তা না হয় তবে এটি সম্ভবত বিদ্যমান প্যাকেজটির একটি সমস্যা যা টাইমজোন ছাড়াই তারিখটি নিয়ে আসে এবং আপনি প্যাকেজটি প্যাচ করতে পারেন, সতর্কতাটিকে উপেক্ষা করতে পারেন বা ইউএসপিএডজেডকে মিথ্যাতে সেট করতে পারেন।


8
আপনি কোথায় লিখছেন tzinfo=<UTC>, কি <UTC>? এটি আমি দেখেছি এমন সিনট্যাকটিক নির্মাণ নয়।
জামেসফিশার

4
পার্টিতে কিছুটা দেরি হলেও আপনি যা দেখছেন তা হ'ল শেল থেকে আউটপুট । আরো নির্দিষ্টভাবে, এটি DATETIME বস্তুর থেকে আউটপুট আছে 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)
অ্যানয়েজ

আমার সেটিংস USE_TZ = True, TIME_ZONE = 'UTC'। তবে আমি যখন timezone.now()এটি ব্যবহার করি তা প্রদর্শিত হয় না tzinfo=<UTC>.... সুতরাং এই ডেটটাইম অবজেক্টটি নির্বোধ হিসাবে পাস করা হয়েছে। কেন এমন হয়?
ব্যবহারকারী 3595632

71

আপনার নিষ্পাপ ডেটটাইম অবজেক্টদের টাইমজোন সচেতন করতে এবং সেই সতর্কতাগুলি এড়াতে django.utils.timezone.make_aware ফাংশন ব্যবহার করুন ।

এটি নির্লজ্জ ডেটটাইম অবজেক্টকে (টাইমজোন তথ্য ছাড়াই) রূপান্তর করে এমন একটিতে যা টাইমজোন তথ্য (আপনার জ্যাঙ্গো সেটিংসে নির্দিষ্ট টাইমজোন ব্যবহার করে যদি আপনি এটিকে দ্বিতীয় তর্ক হিসাবে স্পষ্টভাবে নির্দিষ্ট না করেন):

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>

এই উত্তরের জন্য ধন্যবাদ, আমার
জ্যাঙ্গো

মডেল.পি-তে এটি রাখা কি সম্ভব?
ফ্লোরেন্ট

@ ফ্লোরেন্ট যদি আপনি ডিফল্টরূপে utc টাইমজোন ব্যবহার করেন, 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 = টাইমজোন.টসি)
আই। ইয়েগোর

আপনাকে ধন্যবাদ, এটি কাজ করেছে
এটম

আইএমও এটি সবচেয়ে ব্যবহারিক সমাধান
রামটিন

9

এক উভয় ফিক্স সাবধানবাণী করতে এবং সময় অঞ্চল 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_aware, দেখুন dmrz পোস্ট।


5

দ্রুত এবং নোংরা - এটি বন্ধ করুন:

USE_TZ = False

আপনার মধ্যে settings.py


1
যখন ইউএসপিএলজেডটি সত্য হয় এবং ডাটাবেস সময় অঞ্চলগুলিকে সমর্থন করে (যেমন পোস্টগ্রিজ এসকিউএল), তখন ডকস.ডজ্যাঙ্গোপ্রজেক্ট
জেন /

3

আপনি সেটিংস ওভাররাইড করতে পারেন, বিশেষত পরীক্ষায় কার্যকর:

from django.test import override_settings

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

এটি আপনাকে সতর্কতাটি দেখতে বাধা দেবে, একই সাথে আপনার কোডের যে কোনও কিছুতে টাইমজোন সচেতন তারিখের প্রয়োজন যা আপনাকে সমস্যা দিতে পারে। যদি এটি হয় তবে ক্রেভিটেজ উত্তর দেখুন।


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 একটি নিষ্পাপ ডেটটাইম এবং টি 2 জাঙ্গোর সেটিংসে টাইমজোন সহ একটি ডেটটাইম।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.