我目前有一个需要重写的结构才能应对Django-CMS
目前设置如下
class Video(models.Model):
#embed_code_or_url = models.CharField(max_length=2000)
permalink = models.URLField(verify_exists=True, unique=True, max_length=255, default="http://", validators=[validate_youtube_address])
thumbnail = models.CharField(max_length=500, blank=True, null=True)
# Data
title = models.CharField(max_length=255, blank=True)
...
class VideoPlugin(CMSPlugin):
video = models.ForeignKey(Video)
当我现在将所有字段从Video
转移到VideoPlugin
时,运行我的架构移植,我还想在运行迁移时将所有信息从Video传输到VideoPlugin。
有没有人举例说明如何实现这一目标?
以下是要运行的迁移的开始时间
class Migration(SchemaMigration):
def forwards(self, orm):
# Adding field 'VideoPlugin.permalink'
db.add_column('cmsplugin_videoplugin', 'permalink', self.gf('django.db.models.fields.URLField')(default='http://', unique=True, max_length=255), keep_default=False)
# Adding field 'VideoPlugin.thumbnail'
db.add_column('cmsplugin_videoplugin', 'thumbnail', self.gf('django.db.models.fields.CharField')(max_length=500, null=True, blank=True), keep_default=False)
# Adding field 'VideoPlugin.title'
db.add_column('cmsplugin_videoplugin', 'title', self.gf('django.db.models.fields.CharField')(default='', max_length=255, blank=True), keep_default=False)
...
非常感谢您的帮助
答案 0 :(得分:15)
您创建了一个数据迁移:
$ python manage.py datamigration yourapp name_of_this_migration
这会冻结您应用中的模型。如果迁移中涉及其他应用,则您需要向该行添加--freeze app1 --freeze app2
等,以包含迁移中的那些应用。
这会为您设置基本迁移文件结构,但forwards
和backwards
迁移为空。由您决定将数据从一个迁移到另一个的逻辑。但是除了你使用南ORM之外,这与Django中的其他任何东西都有效。对于此迁移所在的应用中的任何模型,您使用orm.MyModel.objects
用于使用--freeze
参数添加的任何其他应用,使用orm['someapp.SomeModel'].objects
。
除此之外,您只需获取/过滤/创建等对象,正常情况下将数据从一个移动到另一个。显然,您的转发迁移需要将数据移动到您现在所需的逻辑,并且您的向后迁移应该具有将数据恢复到原来所需的逻辑。
然后,您可以在开发环境中向前和向后迁移,以确保其正常运行。一个重要的注意事项:这仅用于移动数据。请勿更改或删除数据迁移中的任何表格结构。如果需要在移动数据后删除表。 数据迁移后创建一个schemamigration 。