通常、発生する DB 移行は解決できますが、これには困惑しています。
UUIDField
(from django-extensions
) を主キーとして作成した新しいモデルがあります。
# BaseModelNamed is just a mixin which provides some basic fields
# e.g. name, description, slug, created, modified
class UUIDObject(BaseModelNamed):
uuid = UUIDField(primary_key=True)
このモデルを参照する別のモデルもあります。
class ParentModel(BaseModelNamed):
default_uuidobject = models.OneToOneField(UUIDObject,
related_name='parent_model', blank=True, null=True)
uuidobject_collection = models.ManyToManyField(UUIDObject,
related_name='parent_models', blank=True, null=True)
...そして、自動生成された移行:
def forwards(self, orm):
# Adding model 'UUIDObject'
db.create_table('app_uuidobject', (
('created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, null=True, blank=True)),
('last_modified', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, null=True, blank=True)),
('name', self.gf('django.db.models.fields.CharField')(max_length=255, null=True, blank=True)),
('description', self.gf('django.db.models.fields.TextField')(null=True, blank=True)),
('slug', self.gf('django.db.models.fields.SlugField')(max_length=50, null=True, blank=True)),
('uuid', self.gf('django.db.models.fields.CharField')(max_length=36, primary_key=True)),
))
db.send_create_signal('app', ['UUIDObject'])
# Adding field 'ParentModel.default_uuidobject'
db.add_column('app_parentmodel', 'default_uuidobject',
self.gf('django.db.models.fields.related.OneToOneField')(blank=True, related_name='parent_model', unique=True, null=True, to=orm['app.UUIDObject']),
keep_default=False)
ただし、実際に移行を実行しようとすると、移行エラーが発生し続けます。
django.db.utils.DatabaseError: (1005, "Can't create table 'db.#sql-819_2ed' (errno: 150)")
私が解読したことから、実行SHOW ENGINE INNODB STATUS
すると問題に対するより多くの洞察が得られます。実際、次のことが明らかになります。
------------------------
LATEST FOREIGN KEY ERROR
------------------------
130424 20:34:02 Error in foreign key constraint of table ebdb/#sql-819_2ed:
FOREIGN KEY (`default_uuidobject_id`) REFERENCES `app_uuidobject` (`uuid`):
Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.
South と互換性のある方法で UUIDField を使用するにはどうすればよいですか?
または、この移行の競合を解決するにはどうすればよいですか?
現在、次のパッケージを使用しています。
django-extensions==0.9
South==0.7.6
Django==1.4.1
編集:
移行でインデックス
を追加db_index
して作成しようとしましたが、どちらも成功していません:
# ...
('uuid', self.gf('django.db.models.fields.CharField')(max_length=36, primary_key=True, db_index=True)),
))
db.create_index('app_uuidobject', ['uuid'], unique=True)