如何将Django模型字段分解为自己的模型,保留数据?

时间:2017-07-20 16:47:43

标签: python django django-orm

我有一个像这样的Django ORM模型:

class Foo(models.Model):
    data = models.CharField(null=True, blank=True)

    bar_id = models.IntegerField(null=True, blank=True)
    bar_data = models.CharField(null=True, blank=True)

我想将bar_idbar_data分解为单独的模型类:

class Foo(models.Model):
    data = models.CharField(null=True, blank=True)
    bar = models.ForeignKey('Bar', null=True, blank=True)

class Bar(models.Model):
    id = models.IntegerField(primary_key=True)
    data = models.CharField(null=True, blank=True)

我已经确定每个bar_id只有一个与bar_data相关联的值,而bar_data始终是None,如果bar_idNone,因此应该可以将旧的bar_data字段迁移到新的Bar对象中,我只是不知道该怎么做。

我可以在保留数据的同时迁移到这些新模型吗?

1 个答案:

答案 0 :(得分:4)

正确的django-ish方法是:

  • 使用新模型(Bar)创建架构迁移(https://docs.djangoproject.com/en/1.11/topics/migrations/) - 此迁移应该只添加Bar而不添加任何实例
  • 创建数据迁移(https://docs.djangoproject.com/en/1.11/topics/migrations/#data-migrations),将数据从旧模型复制到新模型。您只需循环所有Foo个实例并根据您的要求创建Bar个实例。如果确实需要,您还可以尝试创建向后数据迁移(即循环所有Bar实例并正确更新Foo实例)以进行此数据迁移。请注意,在此迁移过程中,您将FooBar以及bar_id中的bar_dataFoo字段。
  • 创建第二个架构迁移,从bar_id删除(删除)不需要的字段(bar_dataFoo)。

正如我所说,这是正确的,django-ish方式。但是,如果你想要快速和脏的东西,你可以使用postgresql(使用PL / pgsql)查看我的文章,在数据库中进行这样的更改:https://spapas.github.io/2017/07/04/postgresql-auto-create-category-column/