0

プロキシ モデル users.User を ManyToMany フィールドとして参照する既存の Django モデルがあります。最近、モデルの最初の南への移行を作成し、 --fake フラグを使用して問題なく適用しました。

ここで、リポジトリを新たに複製し、syncdb を実行してから、移行を適用しようとすると、ManyToMany フィールドを使用してモデルを処理しているときに、次の South エラーが発生します。

Running migrations for <app>:
 - Migrating forwards to 0001_initial.
 > <app>:0001_initial
Traceback (most recent call last):
  File "manage.py", line 14, in <module>
    execute_manager(settings)
... (traceback)
raise KeyError("The model '%s' from the app '%s' is not available in this migration." %    (model, app))
KeyError: "The model 'user' from the app 'users' is not available in this migration."

この特定のアプリについて、毎回移行を偽造する必要がありますか? 誰でもこのエラーの経験がありますか?

4

3 に答える 3

0

これは、South (現在のバージョン 0.8.4) がプロキシ モデルとの ManyToMany 関係の正しい移行を作成できないために発生します。この問題のオープン チケットがあります。スルー クラスとの ManyToMany 関係を使用して回避できますが。

于 2013-11-30T20:55:07.430 に答える
0

それはまだ未解決の問題であるため (コーダーの私たちの生活のように南リポジトリで:))、ここに私の通常の回避策があります:

1. 新規インストール

django-admin.py syncdb --all
django-admin.py migrate --fake

2. 移行を (手動で) 修正する

(前)

    db.create_table(m2m_table_name, (
        ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
        ('message', models.ForeignKey(orm[u'email.message'], null=False)),
        ('avcpuser', models.ForeignKey(orm[u'profiles.avcpuser'], null=False)) # this is the troublesome proxy model (profiles.avcpuser is my proxy towards auth.User
    ))

(後)

    db.create_table(m2m_table_name, (
        ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
        ('message', models.ForeignKey(orm[u'email.message'], null=False)),
        ('avcpuser', models.ForeignKey(orm[u'auth.User'], null=False)) # replace it with a ForeignKey to the original model
    ))

正直なところ、この修正が「正当」であり、「ベスト プラクティス」に挙げられるかどうかは 100% 確信が持てませんが、これまでのところ、既存および新規のプロジェクトを維持する上で問題は発生しませんでした。私の弁護として、私は、South がプロキシ モデルに対して 1 対多の ForeignKey を生成するときに、元のモデルに対してそれを行うことに気づいて、この考えに至りました。

于 2015-06-12T13:08:45.420 に答える
0

users.User がプロキシ モデルである理由 クローンリポジトリでは、syncdb を使用せずに south のみを使用する必要があると思います。

于 2012-07-10T18:39:34.437 に答える