Django Grok YMLはありますか? djangoはフィクスチャーYMLファイルをロードしていません(YMLは既知のシリアル化ではありません)
-
28-09-2019 - |
質問
最初の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
認識された拡張機能として。