2012-09-17 16 views
5

私はmysqlとタイムゾーンを有効にしてdjango 1.4.1を使用しています。私はyamlにダンプデータを作成し、いくつかのフィールドを修正していくつかのテストデータを作成しましたが、それを読み込もうとしていますが、Djangoはtzが指定されていても素朴なdatetimesについて不平を言い続けますLoaddataがタイムスタンプとタイムゾーンを正しく処理していません

具体的には、

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. UTCタイムスタンプ
  2. Djangoはdumpdataの

を使用してエクスポートと同じ正確なフォーマットは、私は、これはUTCの日付であるジャンゴ伝えることができるいくつかの方法がありますか? docsから

答えて

8

... ...ので、代わりの

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' 

..または...

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

...が動作します。

19

問題はPyYAMLに起因します。負荷データがdatetimeをPyYAMLに渡すと、それは認識日時をとり、時刻をUTCに調整してから、naive datetimeを返して警告を生成します。

問題に関するDjango ticketPyYAML ticketがあります。上記の予期せぬ挙動については、どちらも詳細に詳しく説明されています。チケットのコメントで判断すると、この問題はすぐに解消される可能性は低いようです。

あなたのプロジェクトのsettings.pyにTIME_ZONE = 'UTC'が設定されていますが、正しい時間に読み込まれますが、警告は表示されます。あなたのタイムゾーンが他のものに設定されていれば、Djangoはdatetimeをローカルとして扱い、それをおそらく望ましくないUTCに調整します。

これを避ける最も良い方法は、JSONをシリアル化フォーマットとして使用することです。

希望に役立ちます。

1

django/core/serializers/pyyaml.pyをプロジェクトディレクトリにコピーして をコピーして、次のコードを置き換えても構いません(ver.1.9の場合はおそらく78-79行です)。もちろん既にインストールpytzと

import pytz 

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 

から9)

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

必要とされています。

このコードは、すべてのnaive datetime値をUTC対応に変換します。

settings.pyにSERIALIZATION_MODULESを追加し、デフォルトのシリアライザを無効にするには、次の

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

私は、この猿のパッチが正常に動作します願っています。

+0

https://djangosnippets.org/snippets/10586/で完全なコードをアップロードしました。 –

関連する問題