2012-09-17 12 views
5

mysql ve saat dilimleri etkinken django 1.4.1 kullanıyorum. Ben, bazı test verileri oluşturmak için bazı alanları değiştirdim yaml için bir dökümü veri yaptım ve onu geri yüklemeye çalışıyorum. Ancak, Django özellikle bir tz belirtilmiş olsa bile bir tz belirtilmişZaman damgası ve saat dilimlerinin düzgün çalışmaması Loadeta

benim loaddata:

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

ama loaddata hata veriyor: olarak görerek, bu benim için çok mantıklı değil

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

:

  1. bir UTC zaman damgası
  2. Django dumpdata kullanılarak dışa tamamen aynı formatı

ben bu bir UTC tarihtir django söyleyebilir bir yol var mı? docs itibaren

cevap

8

... ... bu yüzden yerine

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' 

... birini ...

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

.. .or ...

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

... işe yarayacak.

19

Sorun PyYAML'den kaynaklanıyor. Loaddata, datetime'yi PyYAML'a kapattığında, farkında tarih bilgisini alır, zamanı UTC'ye ayarlar ve ardından uyarı üreten bir naif datetime verir.

Sorunla ilgili bir PyYAML ticket'un yanı sıra bir Django ticket vardır. Her ikisi de yukarıda beklenmeyen davranışlarla ilgili çok daha büyük ayrıntılara girer. Biletlerdeki yorumlara bakıldığında, bu sorunun yakın zamanda çözülmesi mümkün görünmemektedir.

Projenizin settings.py bölümünde TIME_ZONE = 'UTC' ayarını yaparsanız, doğru zamanda yüklenir, ancak yine de uyarı alırsınız. Saat diliminiz başka bir şeye ayarlanmalıysa Django, tarih saatini yerel olarak ele alacak ve muhtemelen istenmeyen bir şekilde UTC'ye ayarlayacaktır.

Bundan kaçınmanın en iyi yolu JSON'u bir serileştirme biçimi olarak kullanmaktır.

Bu yardımcı olur umarım.

1

django/core/serializers/pyyaml.py dosyasını proje direktifinize ( ) kopyalayabilir ve aşağıdaki kodu değiştirebilirsiniz (ver.1.9 durumunda belki 78-79 satır).9)

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

ders pytz ait

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 

zaten yüklü ve

import pytz 

için gereklidir.

Bu kod, tüm naif datetime değerlerini UTC'nin farkında hale getirecektir.

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

ben bu maymun yama çalışıyor umut:

settings.py içinde SERIALIZATION_MODULES ekleyin varsayılan seri hale geçersiz kılmak için.

+0

https://djangosnippets.org/snippets/10586/ adresinden eksiksiz bir kod yükledim –