如何使用迁移来移动数据

时间:2017-06-20 11:57:36

标签: python django python-3.x django-models

我有一个场景,我需要将数据从一个模型(已经存在一些数据的旧模型)移动到另一个模型,然后在必要时转移到另一个模型。我可以添加这个在迁移文件中进行处理,这样我就可以用python manage.py migrate命令完成要求。

这是所有旧项目存在的模型:

class UserFavorite(CreatedAtMixin):
    user = models.ForeignKey('auth.User')
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')

objects = UserFavoriteManager()

def __str__(self):
    try:
        return str(self.content_object)
    except AttributeError:
        return 'None'

class Meta:
    get_latest_by = "date_added"
    unique_together = ("user", "content_type", "object_id")`

以下是我需要在上面的模型中按项目首先插入项目的模型:

class CollectionItem(models.Model):

sort_number=models.PositiveIntegerField(blank=True,null=True)
type=models.CharField(max_length=20,null=False, blank=False)
item_type = models.ForeignKey(ContentType, limit_choices_to=models.Q(app_label='news', model='News') | models.Q(app_label='work', model='Work') | models.Q(app_label='collection', model='Quote'))
item_id = models.PositiveIntegerField()
item = generic.GenericForeignKey('item_type', 'item_id')

class Meta:
    verbose_name = "Collection Item"
    verbose_name_plural = "Collection Items"
def __str__(self):
    return self.item.title

然后我需要将其插入:

class Collections(CreatedAtMixin):
user = models.ForeignKey('auth.User', related_name='collections_user')
collection_place=models.ForeignKey('companies.CompanyOffice',related_name='collections_place',null=True)
collection_name = models.CharField(max_length=40,null=False, blank=False)
description = models.TextField(null=True, blank=True)
items=models.ManyToManyField('collection.CollectionItem')
def __str__(self):
    return self.collection_name

class Meta:
    unique_together = ("user","collection_name")
    verbose_name = "Collection"
    verbose_name_plural = "Collections"
    ordering = [ '-created_at']
    get_latest_by = "created_at"

1 个答案:

答案 0 :(得分:1)

首先编写新模型和create a schema migration

然后create a data migration并编写所需的代码以将旧模型数据传输到新模型(提示:如果可能,还要编写代码以恢复迁移)。

最后 - 假设旧模型不再使用 - 删除旧模型代码并创建最后一个模式迁移。

详细信息都记录在上面的链接中,剩下的内容特定于您的应用程序,因此我们无法提供帮助。