2013-03-19 34 views
8

Django projem için bazı temel donanımlar kurdum. veritabanına eklenen kayıtlarından biri gibi görünüyor şu:django fikstürleri DateTimeField runtimeWarning

{ 
    "model": "articles.article", 
    "pk": 1, 
    "fields": { 
     "title": "Blackened Recordings Launches", 
     "headline": "we're so psyched about our new adventure", 
     "content": "<p>We like to make it a point here not to bore you with the not-so-exciting business aspects of making and sharing music, but we're so psyched about our new adventure that we just had to tell you about it as we officially launch our very own record label, Blackened Recordings.</p><p>Some of you, who have followed along throughout the years, are aware that in 1994 we renegotiated our contract with the Warner Music Group, which resulted in a joint venture with our record company for releasing all of our recordings including long form videos. Per that agreement, as of today we have taken ownership of all of our master recordings and Blackened Recordings will be the home of all of our current albums and videos along with all future releases including the December 10 release of the \"Quebec Magnetic\" DVD and Blu-ray.</p><p>You may have heard us say it once or twice or a thousand times before, but it's always been about us taking control of all things 'Tallica to give you 110% on every single level every single time. Forming Blackened Recordings is the ultimate in independence, putting us in the driver's seat of our own creative destiny. We're looking forward to making more music and getting it all out to you in our own unique way.</p>", 
     "image": "examples/slide-03.jpg", 
     "active": 1, 
     "created_at": "2013-03-16 17:41:28" 
    } 
    }, 

Bu tekabül modelidir:

demirbaş kayıtlarını eklerken
class Article(models.Model): 
    """News article, displayed on homepage to attract users""" 
    class Meta: 
     db_table = 'article' 
    title = models.CharField(max_length=64) 
    headline = models.CharField(max_length=255) 
    content = models.TextField() 
    image = models.ImageField(upload_to = 'articles/', null=True, blank=True) 
    active = models.BooleanField() 
    created_at = models.DateTimeField() 
    def __unicode__(self): 
     return self.title 

, ben olsun aşağıdaki uyarı:

/usr/local/lib/python2.7/dist-packages/django/db/models/fields/__init__.py:827: RuntimeWarning: DateTimeField received a naive datetime (2013-03-16 17:41:28) while time zone support is active. 
    RuntimeWarning) 

Burada neyin yanlış olduğu hakkında hiçbir fikrim yok. this blog post'u izlemeyi denedim, ancak pytz'i yükledim ve benim settings.py'de USE_TZ=True seçeneğim var.

cevap

14

Aslında çözüm python docs derin gizlidir, aşağıda alıntı:

"2013-03-16T17:41:28+00:00" 
"2013-03-17T23:36:12+00:00" 
"2013-03-18T13:19:37+00:00" 

ve çıkış oldu:

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

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

Böyle fikstürler tamamen kabul edilir, benim durumumda oldu

$ ./manage.py loaddata articles/fixtures/initial_data.json 
Installed 3 object(s) from 1 fixture(s) 

Not: '2013-03-16 17:41:28 UTC+0000', saat diliminin farkında olduğu datetime biçiminde değildir ve size aşağıdakileri verecek ng hatası: PyYaml da

DeserializationError: Problem installing fixture 'articles/fixtures/initial_data.json': [u"'2013-03-16 17:41:28 UTC+0000' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] format."] 
2

Muhtemelen created_at alanınıza daha yakından bakmalısınız (know aboutauto_now_add=True?).

Ben kullandığınız ne tahmin ediyorum, bu yüzden

import datetime 
from django.utils.timezone import utc 

Article.created_at = datetime.datetime.utcnow().replace(tzinfo=utc) 

gibi bir şey deneyebilirsiniz Ya da settings.py

yılında

USE_TZ = False 

ayarlayarak saat dilimi desteğini devre dışı olabilir

Veya farkında olmamanız datetime'nizi farkettirirsiniz

import datetime 
import pytz 
utc=pytz.UTC 

# where ever you get your datetime from 
unaware = datetime.datetime(2013,3,16,17,41,28,0) 

now_aware = utc.localize(unaware) 
+0

Armatürleri ya ./manage.py loaddata path_to_file' veya './manage.py syncdb' ile (yalnızca otomatik olarak), python kodunda doğrudan yüklemiyorum. Cevabınız hakkında herhangi bir fark yaratıyor mu? – ducin

+0

Bu, ham verilerinizin zaman dilimi belirli değil gibi geliyor - bu yüzden, 'USE_TZ = False' – danodonovan

+1

'u deneyin. Tüm proje zaman dilimi farkındaysa ('USE_TZ = True'), saat dilimini belirleyen fikstürleri hazırlamak daha iyi olur. Her neyse, ipuçların beni kesin cevaba yönlendirdi, ben de + 1 vereyim, teşekkürler! – ducin

3

Eğer unserializing datetime s hatanın seri hale getirmek yaml orada görünüyor kullanıyorsanız:

https://code.djangoproject.com/ticket/18867

deneyin ya serileştiriciye olarak json kullanarak ya da ekleyebilir .tml dosyasında datetime etrafında alıntılar.