2013-03-19 13 views
8

Ustawiłem kilka podstawowych urządzeń dla mojego projektu django. Jeden z zapisów wprowadzonych do bazy danych wygląda tak:django fixtures 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" 
    } 
    }, 

Jest to model odpowiada:

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 

Wkładając rekordy osprzętu, otrzymuję następujące ostrzeżenie:

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

Nie mam pojęcia, co jest nie tak. Próbowałem podążać za this blog post, ale mam zainstalowany pytz i mam opcję USE_TZ=True w moim settings.py.

Odpowiedz

14

Rzeczywiście, rozwiązanie jest ukryte głęboko w python docs, cytuję poniżej:

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

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

Takie urządzenia są w pełni akceptowane, w moim przypadku było to:

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

a wyjście było:

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

Należy pamiętać, że '2013-03-16 17:41:28 UTC+0000' nie jest właściwym formatem datetime świadomym strefy czasowej i będzie zawierał ng błąd:

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
Powinieneś podejrzeć bliżej swoje pole created_at (robisz know about auto_now_add=True?).

zgaduję, co używasz, więc można spróbować czegoś jak

import datetime 
from django.utils.timezone import utc 

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

Lub można wyłączyć obsługę strefy czasowej poprzez ustawienie

USE_TZ = False 

w swoim settings.py

Możesz też uczynić swoją nieświadomą datę-datum świadomą

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

Załaduję urządzenia przez './manage.py loaddata path_to_file' lub przez' ./manage.py syncdb' (tylko pliki automatyczne), a nie bezpośrednio w kodzie Pythona. Czy ma to wpływ na twoją odpowiedź? – ducin

+0

To brzmi tak, jakby twoje surowe dane nie były specyficzne dla strefy czasowej - więc spróbuj "USE_TZ = Fałsz" – danodonovan

+1

Myślę, że lepiej jest przygotować osprzęt z timezone, jeśli cały projekt ma świadomość strefy czasowej ('USE_TZ = True'). W każdym razie twoje wskazówki doprowadziły mnie do dokładnej odpowiedzi, więc daję +1, dzięki! – ducin

3

Także jeśli używasz yaml do serializacji nie wydaje się być błąd w unserializing datetime sw PyYaml:

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

Spróbuj albo za pomocą json jako serializatora lub można dodać cytuje wokół datetime w pliku .yaml.

Powiązane problemy