6

mysqlとタイムゾーンを有効にしてdjango1.4.1を使用しています。yamlにデータをダンプし、いくつかのフィールドを変更してテストデータを作成し、それを再度ロードしようとしています。ただし、tzが指定されていても、Djangoはナイーブな日時について文句を言い続けます。

具体的には、私の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の日付であるとdjangoに伝える方法はありますか?

4

4 に答える 4

22

問題はPyYAMLに起因します。loaddataが日時をPyYAMLに渡すと、認識された日時を取得し、UTCに調整してから、警告を生成する単純な日時を返します。

この問題に関するDjangoチケットPyYAMLチケットがあります。どちらも、上記の予期しない動作に関してさらに詳しく説明します。チケットのコメントから判断すると、この問題はすぐには解決されないようです。

プロジェクトのsettings.pyに設定さTIME_ZONE = 'UTC'れている場合、正しい時間にロードされますが、それでも警告が表示されます。タイムゾーンが他の値に設定されている場合、Djangoは日時をローカルとして扱い、UTCに調整します。これはおそらく望ましくありません。

これを回避する最善の方法は、JSONをシリアル化形式として使用することです。

お役に立てば幸いです。

于 2012-12-04T20:28:29.000 に答える
9

ドキュメントから..。

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

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

素朴な日時の場合、それは明らかにそうではありません:

"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'

...動作します。

于 2012-11-15T18:35:32.103 に答える
2

django / core / serializers / pyyaml.pyをプロジェクトディレクトリにコピーして、次のコードを置き換えることができます(ver.1.9.9の場合は78〜79行かもしれません)

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

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

もちろん、pytzはすでにインストールされています

import pytz

が必要です。

このコードは、すべてのナイーブ日時値をUTC対応に変換します。

デフォルトのシリアライザーをオーバーライドするには、settings.pyにSERIALIZATION_MODULESを追加します。

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

このモンキーパッチがうまく機能することを願っています。

于 2016-09-08T13:43:46.400 に答える
0

データにコメントを含めることができるように、JSONフィクスチャの代わりにYAMLを引き続き使用したいと思いました。ここからの回避策は私にとっての問題を修正しました:https ://code.djangoproject.com/ticket/18867

つまり、YAMLフィクスチャを手動で変更して次のようにします。

  • !!timestampYAMLタグを使用しません
  • タイムスタンプ値を引用符で囲みます
  • タイムスタンプ値にタイムゾーン情報を含めます

...そして明らかに、壊れたPyYAMLロジックではなく、Djangoのタイムスタンプ解析ロジックをトリガーします。

于 2019-01-08T19:49:21.120 に答える