15

djangoプロジェクトにいくつかの基本的なフィクスチャを設定しました。データベースに挿入されたレコードの1つは、次のようになります。

  {
    "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"
    }
  },

これは、対応するモデルです。

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

フィクスチャレコードを挿入すると、次の警告が表示されます。

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

ここで何が悪いのかわかりません。このブログ投稿をフォローしようとしましたが、pytzがインストールされておりUSE_TZ=True、settings.pyにオプションがあります。

4

3 に答える 3

27

実際、解決策はpython docsに深く隠されています。以下に引用します。

認識日時をシリアル化する場合、次のように UTC オフセットが含まれます。

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

そのようなフィクスチャは完全に受け入れられます。私の場合は次のとおりです。

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

出力は次のとおりです。

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

これ'2013-03-16 17:41:28 UTC+0000'は適切なタイムゾーン対応の日時形式ではなく、次のエラーが発生することに注意してください。

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."]
于 2013-03-20T14:12:36.470 に答える
2

あなたはおそらくあなたのcreated_at分野をもっとよく見るべきです(あなたは知ってい auto_now_add=Trueますか?)。

私はあなたが使用しているものを推測しているので、次のようなものを試すことができます

import datetime
from django.utils.timezone import utc

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

または、設定してタイムゾーンのサポートを無効にすることもできます

USE_TZ = False

あなたのsettings.py

または、認識していない日時を認識させることができます

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)
于 2013-03-19T18:31:39.000 に答える