6

私が取り組んでいる django プロジェクトには、大量の initial_data フィクスチャ データがあります。デフォルトでは、データを自動的にロードする唯一の方法は、アプリフォルダーに というファイルを作成fixturesすることであり、ファイルに名前を付ける必要がありますinitial_data.ext(ext は xml または json または yaml など)。

これは本当に柔軟性がないと思います。私はフィクスチャ フォルダを作成し、その中に initial_data フォルダを作成し、その中にそのアプリのモデルごとに 1 つのファイルを作成したいと考えています。またはその趣旨の何か。これは今djangoで行うことができますか? または、より良いフィクスチャ構成の他のスキームかもしれません。

4

4 に答える 4

10

私の経験では、ハードコーディングされたフィクスチャは書くのも維持するのも大変です。モデルの変更によってフィクスチャが壊れるたびに、Django の初期ロードで非常に不親切なエラー メッセージが返され、問題の原因を突き止めるために Django コアに大量のプリントを追加することになります。

私が一緒に働いている開発者の 1 人は、この問題を克服するために非常に優れたライブラリを開発しました。それはdjango-dynamic-fixtureと呼ばれ、私たちはそれをとても気に入っています。仕組みは次のとおりです。

次のモデルがあるとします。

class Author(models.Model):
    name = models.CharField()

class Book(models.Model):
    author = models.ForeingKey(Author, required=True)
    title = models.CharField()

テストで本のインスタンスを作成するために必要なことは、

from django_dynamic_fixture import get
from app import Book

class MyTest(TestCase):
    def setUp(self):
        self.book = get(Book)

django-dynamic-fixture は、Book モデルが存在するために必要な依存関係を自動的に作成します。これは単純な例ですが、ライブラリは非常に複雑なモデル構造を処理できます。

于 2011-07-01T05:10:44.987 に答える
2

必要に応じて初期データ フィクスチャを再編成し、post_syncdbそれらをロードするシグナル ハンドラを作成できます。syncdbそのため、定義したロジックに従って、自動的に にロードされます。

参照: https://docs.djangoproject.com/en/1.3/ref/signals/#post-syncdb

于 2011-07-05T16:07:44.300 に答える
0

追加の initial_data.json を 1 つまたは 2 つ読み込むハックな方法は、Django プロジェクト内に追加の空のアプリを作成することです。このアプリには、fixtures フォルダーと initial_data.json ファイルしかありません。他のアプリのフィクスチャの前にフィクスチャをロードする必要がある場合は、aa1. 別のものが必要な場合は、名前を付けることができますaa2。ディレクトリ構造は次のようになります。

aa1/
   fixtures/
      initial_data.json

aa2/
   fixtures/
      initial_data.json

myrealapp/
   fixtures/
      initial_data.json
...

INSTALLED_APPSにアプリを追加する必要がありますsettings.py

その後、必要に応じて、fixture_data.json ファイルに任意のアプリ情報を入力できます。

(virtualenv) ./manage.py dumpdata --indent=4 auth > aa1/fixtures/initial_data.json

(virtualenv) ./manage.py dumpdata --indent=4 oauth2 > aa2/fixtures/initial_data.json

(virtualenv) ./manage.py dumpdata --indent=4 myrealapp > myrealapp/fixtures/initial_data.json

を実行するpython manage.py syncdbと、各フィクスチャがアルファベット順に自動的にロードされます。

前述したように、これは非常にハックですが、追加の initial_data.json ファイルが 2 つだけ必要で、それらが読み込まれる順序を制御できる必要がある場合は、これでうまくいきます。

于 2014-06-29T23:07:42.133 に答える
0

はい、フィクスチャーをサブフォルダー構造を持つ複数のファイルに分割できます。ロードするフィクスチャ ファイルを指定し、それらの一部またはすべてをロードするスクリプトを作成できます。私は以前にこれを行ったので、それが機能することを確認できます。

例:django-admin.py loaddata application/module/model.json

詳細についてはloaddata、ドキュメントを参照してください。

于 2010-12-09T16:38:48.983 に答える