4

私は Django 1.5b1 を使用しており、南への移行を行っていますが、一般的には素晴らしい生活を送っています。データベースを作成するスキーマの更新がいくつかあり、特にユーザーテーブルがあります。ff.User次に、 (カスタム ユーザー モデル)のフィクスチャをロードします。

def forwards(self, orm):
        from django.core.management import call_command
        fixture_path = "/absolute/path/to/my/fixture/load_initial_users.json"
        call_command("loaddata", fixture_path)

モデルに別のフィールドを追加するまで、すべてがうまく機能していff.Userます。移行ラインのはるか下です。フィクスチャのロードが壊れました:

DatabaseError: Problem installing fixture 'C:\<redacted>create_users.json':
Could not load ff.User(pk=1): (1054, "Unknown column 'timezone_id' in 'field list'")

Timezone は、ユーザー モデルに追加したフィールド (ForeignKey) です。

ff.User はデータベース内のものとは異なるため、Django ORM は DB エラーで断念します。残念ながら、フィクスチャでモデルを として指定することはできませんorm['ff.User']。これは南方の方法のようです。

これらのフィクスチャの対象となるモデルが変更されたときにフィクスチャが壊れないように、south を使用してフィクスチャを適切にロードするにはどうすればよいですか?

4

6 に答える 6

5

仕事をするDjangoスニペットを見つけました!

https://djangosnippets.org/snippets/2897/

アプリコードの実際のモデル定義ではなく、フィクスチャで凍結されたモデルに従ってデータをロードします! 私にぴったりです。

于 2014-03-24T12:23:26.653 に答える
0

私が見つけた最も洗練された解決策はアプリ モデルのget_model機能が代わりに提供された orm からモデルを提供するように切り替えられる場所です。フィクスチャが適用された後、元に戻されます。

from django.db import models
from django.core.management import call_command

def load_fixture(file_name, orm):
    original_get_model = models.get_model

    def get_model_southern_style(*args):
        try:
            return orm['.'.join(args)]
        except:
            return original_get_model(*args)

    models.get_model = get_model_southern_style
    call_command('loaddata', file_name)
    models.get_model = original_get_model

load_fixture('my_fixture.json', orm)転送定義内から呼び出します。

于 2015-02-27T20:51:52.570 に答える
-1

次の 2 つの投稿を読むことで、解決策を見つけることができました。

http://andrewingram.net/2012/dec/common-pitfalls-django-south/#be-careful-with-fixtures

http://news.ycombinator.com/item?id=4872596

具体的には、 「dumpscript」からの出力を使用するようにデータ移行を書き直しました

South で動作するように、結果のスクリプトを少し変更する必要がありました。する代わりに

from ff.models import User

そうです

User = orm['ff.User']

これは、私が望んでいたとおりに機能します。さらに、フィクスチャのように ID をハードコーディングしないという利点もあります。

于 2012-12-12T12:07:20.780 に答える
-1

通常、South はforwards()andbackwards()関数を使用して移行を処理します。あなたの場合、次のいずれかを行う必要があります。

  • フィクスチャを変更して適切なデータを含めるか、または
  • それを壊す移行の前にフィクスチャをインポートします(または同じ移行内ですが、スキーマを変更する前に)、

2番目のケースでは、列を追加する(または、あなたの場合のように削除する)移行の前に、これと同様にフィクスチャを明示的にロードする移行を実行する必要があります(docs):

def forwards(self, orm):
    from django.core.management import call_command
    call_command("loaddata", "create_users.json")

これが、必要なことを達成する最も簡単な方法だと思います。また、古い移行を適用する前に、新しい構造でデータをインポートしようとするなどの単純な間違いを犯さないようにしてください。

于 2012-12-11T18:06:09.557 に答える