def _rename_table(operation, migrator, introspector, old_name, new_name):
version_old_name = old_name + 'version'
version_new_name = new_name + 'version'
# save all of the foreign key references
models = introspector.generate_models()
OldVersion = models[version_old_name]
# The name of the original record's primary key
to_field_name = OldVersion._original_record.to_field.name
version_id__original_id = []
for version in OldVersion.select(OldVersion._id, OldVersion._original_record):
version_id__original_id.append((version._id, version._original_record_id))
# drop the foreign key field in the OldVersion model
drop_field = Operation(migrator, 'drop_column', version_old_name, '_original_record_id')
drop_field.run()
# rename the original table
operation.run()
# rename the version table
version_rename_table = Operation(migrator, 'rename_table', version_old_name, version_new_name)
version_rename_table.run()
# lookup the new model so we can add a foreign key to it
models = introspector.generate_models()
NewModel = models[new_name]
# Add a new Foregin key reference
_original_record = ForeignKeyField(
NewModel, null=True, on_delete="SET NULL",
to_field=getattr(NewModel, to_field_name)
)
add_foregin_key = Operation(migrator, 'add_column', version_new_name, '_original_record_id', _original_record)
add_foregin_key.run()
# load the new version model with the foregin key
models = introspector.generate_models()
NewModel = models[new_name]
NewVersionModel = models[version_new_name]
# re link all versions
for _id, _original_record_id in version_id__original_id:
version = NewVersionModel.get(NewVersionModel._id == _id)
# ``to_field_name`` is the name of the original record's primary key
model = NewModel.get(getattr(NewModel, to_field_name) == _original_record_id)
version._original_record = model
version.save()
评论列表
文章目录