Django 多表继承的南方迁移
我有两个以前从models.Model继承的模型,现在我对它们进行了重构,以从相同的基础模型继承。Django正在为此使用多表继承,我正在尝试为此生成一个模式和数据迁移。数据库中存在需要迁移的现有数据 我知道Django创建了一个OneToOneField,但我不明白它是如何影响数据库中的现有项的 继承前 继承后 迁移 这基本上就是我运行时生成的迁移:Django 多表继承的南方迁移,django,django-models,django-south,Django,Django Models,Django South,我有两个以前从models.Model继承的模型,现在我对它们进行了重构,以从相同的基础模型继承。Django正在为此使用多表继承,我正在尝试为此生成一个模式和数据迁移。数据库中存在需要迁移的现有数据 我知道Django创建了一个OneToOneField,但我不明白它是如何影响数据库中的现有项的 继承前 继承后 迁移 这基本上就是我运行时生成的迁移: /manage.py模式迁移应用程序--自动 生成的文件: class Migration(SchemaMigration): def
/manage.py模式迁移应用程序--自动
生成的文件:
class Migration(SchemaMigration):
def forwards(self, orm):
db.create_table('app_published', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('published_on', self.gf('django.db.models.fields.DateTimeField')()),
))
db.send_create_signal('app', ['Published'])
db.delete_column('app_blogpost', 'published_on')
db.delete_column('app_blogpost', 'id')
db.add_column('app_blogpost', 'published_ptr', self.gf('django.db.models.fields.related.OneToOneField')(default=None, to=orm['app.Published'], unique=True, primary_key=True), keep_default=False)
db.delete_column('app_audiofile', 'published_on')
db.delete_column('app_audiofile', 'id')
db.add_column('app_audiofile', 'published_ptr', self.gf('django.db.models.fields.related.OneToOneField')(default=None, to=orm['app.Published'], unique=True, primary_key=True), keep_default=False)
当我尝试运行它时,它会引发IntegrityError:
column "published_ptr_id" contains null values
您需要将其分为三个迁移:
null=True
而不是primary\u key=True
添加这些新列:
db.create_table('app_published', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('published_on', self.gf('django.db.models.fields.DateTimeField')()),
))
db.add_column('app_blogpost', 'published_ptr', self.gf('django.db.models.fields.related.OneToOneField')(default=None, to=orm['app.Published'], null=True), keep_default=False)
db.add_column('app_audiofile', 'published_ptr', self.gf('django.db.models.fields.related.OneToOneField')(default=None, to=orm['app.Published'], null=True), keep_default=False)
for blogpost in orm.BlogPost.objects.all():
published = orm.Published.objects.create(published_on=blogpost.published_on)
blogpost.published_ptr = published
blogpost.save()
for audiofile in orm.AudioFile.objects.all():
published = orm.Published.objects.create(published_on=audiofile.published_on)
audiofile.published_ptr = published
audiofile.save()
null=True
更改为primary\u key=True
db.delete_column('app_blogpost', 'published_on')
db.delete_column('app_blogpost', 'id')
db.delete_column('app_audiofile', 'published_on')
db.delete_column('app_audiofile', 'id')
db.alter_column('app_blogpost', 'published_ptr', self.gf('django.db.models.fields.related.OneToOneField')(default=None, to=orm['app.Published'], null=False))
db.alter_column('app_audiofile', 'published_ptr', self.gf('django.db.models.fields.related.OneToOneField')(default=None, to=orm['app.Published'], null=False))
db.create_index('app_blogpost', ['published_ptr'], unique=True)
db.create_index('app_audiofile', ['published_ptr'], unique=True)
db.create_primary_key('app_blogpost', ['published_ptr'])
db.create_primary_key('app_audiofile', ['published_ptr'])
for blogpost in orm.BlogPost.objects.all():
published = orm.Published.objects.create(published_on=blogpost.published_on)
blogpost.published_ptr = published
blogpost.save()
for audiofile in orm.AudioFile.objects.all():
published = orm.Published.objects.create(published_on=audiofile.published_on)
audiofile.published_ptr = published
audiofile.save()
db.delete_column('app_blogpost', 'published_on')
db.delete_column('app_blogpost', 'id')
db.delete_column('app_audiofile', 'published_on')
db.delete_column('app_audiofile', 'id')
db.alter_column('app_blogpost', 'published_ptr', self.gf('django.db.models.fields.related.OneToOneField')(default=None, to=orm['app.Published'], null=False))
db.alter_column('app_audiofile', 'published_ptr', self.gf('django.db.models.fields.related.OneToOneField')(default=None, to=orm['app.Published'], null=False))
db.create_index('app_blogpost', ['published_ptr'], unique=True)
db.create_index('app_audiofile', ['published_ptr'], unique=True)
db.create_primary_key('app_blogpost', ['published_ptr'])
db.create_primary_key('app_audiofile', ['published_ptr'])