2012-06-29 11 views
18

के साथ काम करता है मुझे लगता है कि समय क्षेत्र प्रबंधन django 1.4 में जोड़ा गया था, इसलिए समस्या काफी नई है।कैसे django समय क्षेत्र model.field के auto_now_add

मैं एक साधारण मॉडल

class Sample(models.Model): 
    ... 
    date_generated = models.DateTimeField(auto_now_add = True) 

इस्तेमाल किया जब मैं एक नव निर्मित रिकॉर्ड अपने विफल रहता है को पुनः प्राप्त करने का प्रयास करें।

min_datetime = datetime.now() - timedelta(seconds = 300) 
sample = Sample.objects.get(date_generated__gte = min_datetime) 

और सर्वर एक चेतावनी जारी करता है।

DateTimeField received a naive datetime (2012-06-29 15:02:15.074000) while time zone support is active. 

मुझे लगता है कि इस समस्या के लिए दो समाधान पता लगा।

  1. settings.py

    USE_TZ = False 
    

    में समय क्षेत्र प्रबंधन अक्षम लेकिन यह हमेशा desierable नहीं है।

  2. बदलते

    date_generated = models.DateTimeField(auto_now_add = True) 
    

    को
    date_generated = models.DateTimeField(default=datetime.now()) 
    

    समाधान उस समय क्षेत्र प्रबंधन

उत्तर

17

समस्या काम कर रहा है अपने अंत पर रहता है: datetime.now() बारे में पता TZ नहीं है, तो आप एक बेवकूफ टीजेड में खिला रहे हैं। Django docs on this issue देखें। default=datetime.now सेट करते समय यह काम करता है कि आप एक बेवकूफ डेटाटाइम के लिए मूल्य को मजबूर कर रहे हैं, इसलिए जब आप बाद में इसे किसी अन्य बेवकूफ डेटाटाइम से तुलना करते हैं, तो कोई समस्या नहीं है।

आप निम्नलिखित तरीके से प्राप्त करने के लिए "अब" की जरूरत है:

import datetime 
from django.utils.timezone import utc 

now = datetime.datetime.utcnow().replace(tzinfo=utc) 
+6

इसका मतलब मैं सिर्फ auto_now उपयोग नहीं कर सकते है या auto_now_add अगर मैं USE_TZ = सच है? – dannyroa

+5

ऐसा लगता है कि 'auto_now' और' auto_now_add' स्वाभाविक रूप से 'datetime.now' का उपयोग करते हैं। Django में टीजेड जागरूक सुविधाओं को सम्मिलित करने के लिए Django के हिस्से पर यह एक अजीब चूक है, फिर भी इस सुंदर प्रमुख को याद आती है, लेकिन इन दो kwargs के भाग्य पर लंबे समय से बहस की गई है। मेरा तर्क यह है कि उन्हें पीछे की संगतता (और पुश-बैक से बचने के लिए) में छोड़ा जा रहा है, लेकिन उन्हें किसी भी प्यार के लिए उम्मीद न करें। बस 'utcnow' के साथ' डिफ़ॉल्ट 'kwarg सेट करें और यदि आप टीजेड को जागरूक डेटाटाइम चाहते हैं, तो' auto_now' या 'auto_now_add' के बारे में चिंता न करें। –

+0

धन्यवाद क्रिस। मुझे नहीं लगता कि "डिफ़ॉल्ट" "auto_now" को बदलने में काम करेगा हालांकि बाद में हमेशा "डिफ़ॉल्ट" होने पर प्रत्येक सहेजने के लिए समय अपडेट किया जाता है, जब फ़ील्ड का कोई मूल्य नहीं होता है। – dannyroa

7

, datetime.now() के DateTimeField डिफ़ॉल्ट मान सेट सावधान रहें कि के रूप में एक मूल्य की गणना करेगा जब अपाचे/nginx भार Django (या जब आप शुरू विकास सर्वर), और बाद के सभी रिकॉर्ड उस मान प्राप्त करेंगे।

उस कारण से हमेशा auto_now_add का उपयोग करें।

+13

ब्रैकेट के बिना बस 'default = datetime.now' का उपयोग करें। –

13
Django के

उपयोग समय क्षेत्र utils

from django.utils import timezone 
date_generated = models.DateTimeField(default=timezone.now) 
+1

इस धागे को देखने वाले अन्य लोगों के लिए: ध्यान दें कि उत्तर कैसे कहता है 'अब' और नहीं 'अब() '। दूसरा सर्वर लोड करते समय मूल्यांकन करेगा, जो आप नहीं चाहते हैं। – Pieter

संबंधित मुद्दे