2012-09-17 19 views
5

मैं dsango 1.4.1 का उपयोग mysql और timezones सक्षम के साथ कर रहा हूं। मैंने yaml के लिए एक डंप डेटा किया था, कुछ टेस्ट डेटा बनाने के लिए कुछ फ़ील्ड संशोधित किए थे, और इसे वापस लोड करने की कोशिश कर रहा हूं। हालांकि, डीजेगो को बेवकूफ डेटाटाइम्स के बारे में शिकायत करता रहता है, भले ही एक टीजी निर्दिष्ट किया गया हो, भले ही एक टीजी निर्दिष्ट किया गया हो,लोडडाटा टाइमस्टैम्प और टाइमज़ोन से ठीक से काम नहीं कर रहा है

विशेष रूप से, मेरे लोडडाटा में:

fields: {created_date: !!timestamp '2012-09-15 22:17:44+00:00', ... 

लेकिन loaddata त्रुटि देता है:

RuntimeWarning: DateTimeField received a naive datetime (2012-09-15 22:17:44) while time zone support is active. 

यह मेरे लिए बहुत मतलब नहीं है, जैसा कि इसके देखकर:

  1. एक यूटीसी टाइमस्टैम्प
  2. एक ही सटीक प्रारूप Django DumpData का उपयोग कर निर्यात किया

वहाँ किसी तरह मैं Django यह एक यूटीसी तारीख है बता सकते हैं?

उत्तर

8
docs से

...

When serializing an aware datetime, the UTC offset is included, like this:

"2011-09-01T13:20:30+03:00" 

For a naive datetime, it obviously isn't:

"2011-09-01T13:20:30" 

... इसलिए बजाय ...

created_date: !!timestamp '2012-09-15 22:17:44+00:00' 

... दोनों में से किसी ...

created_date: '2012-09-15T22:17:44+00:00' 

.. .or ...

created_date: '2012-09-15T22:17:44Z' 

... काम करेगा।

19

समस्या PyYAML से उत्पन्न होती है। जब लोडडाटा डेटाटाइम को पीटीवाईएएमएल से हाथ से हटा देता है, तो यह जागरूक डेटाटाइम लेता है, यूटीसी को समय समायोजित करता है, और फिर एक बेवकूफ डेटाटाइम देता है, जो चेतावनी उत्पन्न करता है।

इस मुद्दे से संबंधित Django ticket, साथ ही PyYAML ticket है। दोनों उपरोक्त अप्रत्याशित व्यवहार से संबंधित बहुत अधिक विस्तार में जाते हैं। टिकटों में टिप्पणियों के आधार पर, इस मुद्दे को जल्द ही हल करने की संभावना नहीं है।

क्या आप अपनी परियोजना के settings.py में TIME_ZONE = 'UTC' सेट करते हैं, तो आप सही समय में लोड होंगे, लेकिन आपको अभी भी चेतावनियां मिलेंगी। यदि आपका टाइमज़ोन किसी और चीज पर सेट किया जाना चाहिए, तो डैंजो स्थानीय समय के रूप में डेटाटाइम का इलाज करेगा, और इसे यूटीसी में समायोजित करेगा, जो शायद अवांछित है।

इससे बचने का सबसे अच्छा तरीका JSON को क्रमबद्ध प्रारूप के रूप में उपयोग करना है।

आशा है कि मदद करता है।

1

आप अपने प्रोजेक्ट डीआईआर, पर django/core/serializers/pyyaml.py की प्रतिलिपि बना सकते हैं और निम्न कोड को प्रतिस्थापित कर सकते हैं (शायद ver.1.9 के मामले में 78-79 लाइनें।9)

for obj in PythonDeserializer(yaml.load(stream, Loader=SafeLoader), **options): 
    yield obj 

को
output = yaml.load(stream, Loader=SafeLoader) 
for a_model in output: 
    for key, value in a_model.items(): 
     if key == 'fields': 
      for vkey, vvalue in value.items(): 
       if isinstance(vvalue, datetime.datetime): 
        value[vkey] = vvalue.replace(tzinfo=pytz.utc) 
for obj in PythonDeserializer(output, **options): 
    yield obj 
पाठ्यक्रम pytz की

पहले से ही स्थापित और

import pytz 

की जरूरत है।

यह कोड सभी बेवकूफ डेटाटाइम मानों को यूटीसी से अवगत कराएगा।

डिफ़ॉल्ट serializer ओवरराइड करने के लिए, settings.py में SERIALIZATION_MODULES जोड़ें:

SERIALIZATION_MODULES = {'yaml': 'yourproj.pyyaml'} 

मुझे आशा है कि यह बंदर पैच ठीक काम करता है।

+0

मैंने https://djangosnippets.org/snippets/10586/ पर पूरा कोड अपलोड किया –

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