Django Grok YMLはありますか? djangoはフィクスチャーYMLファイルをロードしていません(YMLは既知のシリアル化ではありません)

StackOverflow https://stackoverflow.com/questions/3880931

質問

最初のDjangoプロジェクトを成功裏に作成しました。

プロジェクトFooとFoobarに2つのアプリがあります。

各アプリフォルダーに「FIXTURES」という名前のフォルダーを作成しました。 settings.ymlでフィクスチャーディレクトリを指定していません。ドキュメントによると)、djangoは私の{app}/fixturesフォルダーを探しているはずです。

{App}/Fixturesフォルダーには、いくつかのYMLファイルがあります。さまざまなモジュールの初期データを個別のYMLファイルに分割し、クロスファイルの依存関係がないことを確認しました(つまり、関連するすべてのモデルは同じYMLファイルにあり、祖先はそれらを使用するモデルの前にファイルに発生します)。

ただし、DBオブジェクトが正常に作成された後、/manage.py syncdbを実行すると、次のメッセージがありました。

備品は見つかりません

次に、LoadDataコマンドを使用して、手動でフィクスチャをロードしようとしました。

./manage.py loaddata 0100_foobar.yml
Problem installing fixture '0100_foobar': yml is not a known serialization 

上記のリンクに記載されているドキュメントは間違っていますか?それとも、DjangoがYMLをグロックするためにモジュールをインストールする必要がありますか?

ところで、YMLファイルは正しく解析し、正しさをチェックされています(私は別のプロジェクトでそれらを正常に使用しました) - それは問題ではありません

編集

Pyyamlをインストールし、Manojの指示に従ってFixturesファイルを変更しました。私は少し先に進むことができますが、私はまだ問題に遭遇しています(ところで、私はpyyaml 3.0.9を使用しています)。

これが私のプロジェクトORM(つまり{App} /Model.py)のモデルです:

class Currency(models.Model):
    short_name = models.CharField(max_length=3, db_index=True, unique=True, null=False) # ISO Code
    long_name = models.CharField(max_length=64, db_index=True, unique=True, null=False)
    spot_settle = models.IntegerField(null=False, default=0)
    rounding = models.IntegerField(null=False, default=2)

これが私がインポートしているYAMLファイルです:

Currency:    
  currency_aud : { short_name: AUD , long_name: Australia - Dollars , spot_settle: 0, rounding: 2 }    
  currency_cad : { short_name: CAD , long_name: Canada - Dollars , spot_settle: 0, rounding: 2 }    
  currency_eur : { short_name: EUR , long_name: Euro Member Countries - Euro , spot_settle: 0, rounding: 2 }    
  currency_gbp : { short_name: GBP , long_name: United Kingdom - Pounds , spot_settle: 0, rounding: 2 }    
  currency_jpy : { short_name: JPY , long_name: Japan - Yen , spot_settle: 0, rounding: 2 }    
  currency_usd : { short_name: USD , long_name: United States Of America - Dollars , spot_settle: 0, rounding: 2 }    
  currency_zar : { short_name: ZAR , long_name: South Africa - Rand, spot_settle: 0, rounding: 2 }    
  currency_hkd : { short_name: HKD , long_name: Hong Kong Dollar, spot_settle: 0, rounding: 2 }    
  currency_nzd : { short_name: NZD , long_name: New Zealand Dollar, spot_settle: 0, rounding: 2 }    
  currency_sgd : { short_name: SGD , long_name: Singapore Dollar, spot_settle: 0, rounding: 2 }    
  currency_dkk : { short_name: DKK , long_name: Danish Krone, spot_settle: 0, rounding: 2 }    
  currency_sek : { short_name: SEK , long_name: Swedish Krona, spot_settle: 0, rounding: 2 }    
  currency_chf : { short_name: CHF , long_name: Swiss Franc, spot_settle: 0, rounding: 2 }

私が実行するときのスタックトレースはこちらです。

me@somebox:~/work/demo/myproj$ ./manage.py loaddata reference/fixtures/0100_currency.yaml 
Installing yaml fixture 'reference/fixtures/0100_currency' from absolute path.
Problem installing fixture 'reference/fixtures/0100_currency.yaml': Traceback (most recent call last):
  File "/usr/local/lib/python2.6/dist-packages/django/core/management/commands/loaddata.py", line 165, in handle
    for obj in objects:
  File "/usr/local/lib/python2.6/dist-packages/django/core/serializers/pyyaml.py", line 57, in Deserializer
    for obj in PythonDeserializer(yaml.load(stream), **options):
  File "/usr/local/lib/python2.6/dist-packages/django/core/serializers/python.py", line 84, in Deserializer
    Model = _get_model(d["model"])
TypeError: string indices must be integers, not str
役に立ちましたか?

解決

私は私のプロジェクトの1つであなたの問題を再現しようとしました。どうやら loaddata 期待します 拡大 シリアル化形式に一致するファイルの。あなたの場合、ファイルの名前を変更する必要があります 0100_foobar.yaml (新しい拡張機能に注意してください)。

ローカルテストでは、私の仮説が正しいことが示されました。

: :YAMLシリアル化には次のことが必要です PyYAML 図書館。既に行っていない場合は、インストールしてください pyyaml.

アップデート

OPのモデルをプロジェクトの1つにコピーしました。 OP AS-ISで与えられたサンプルYAMLをロードしようとしたとき、私は 同じ エラー。

その後、管理者アプリを使用していくつかのデータを追加して使用しました django.core.serializers.serialize YAML形式でデータをダンプします。

from django.core.serializers import serialize
from app.models import Currency
print serializers.serialize("yaml", Currency.objects.all())

結果は、OPが投稿したものとは大きく異なって見えました。下記参照。モデルに3つのインスタンスを追加しましたが、表示されています。

- fields: {long_name: Australia - Dollars, rounding: 2, short_name: AUD, spot_settle: 0}
  model: app.currency
  pk: 1
- fields: {long_name: Canada - Dollars, rounding: 2, short_name: CAD, spot_settle: 0}
  model: app.currency
  pk: 2
- fields: {long_name: Euro Member Countries - Euro, rounding: 2, short_name: EUR,
    spot_settle: 0}
  model: app.currency
  pk: 3

このデータを問題なくロードすることができました。

上記を考えると、OPのYAMLファイルに何か問題があると思います。 @skyeagle、試してみてください ダンピング 既存のデータと それから ダンプを戻してみませんか?

他のヒント

頑固で、本当に、本当に、本当に、ファイルを使用したい私のような人のために .yml 拡張機能、スタートアップでシリアナーを登録して作成できます loaddata フィクスチャファイルを認識します:

from django.apps import AppConfig
from django.core.serializers import register_serializer


class MyAppConfig(AppConfig):
    name = 'my_app_name'
    label = 'my_app_label'
    verbose_name = 'this is my really cool app'

    def ready(self):
        register_serializer('yml', 'django.core.serializers.pyyaml')

通話 register_serializer 登録します yml 認識された拡張機能として。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top