Python 如何将Django模型字段分解到它们自己的模型中,保留数据?

Python 如何将Django模型字段分解到它们自己的模型中,保留数据?,python,django,django-orm,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\u id和bar\u数据分解成一个单独的模型类: class

我有一个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\u id
bar\u数据
分解成一个单独的模型类:

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\u id
只有一个与之关联的
bar\u数据
的值,如果
bar\u id
None
,则
bar\u数据
总是
None
,因此应该可以将旧的
bar\u数据
字段迁移到新的
bar
对象中,我只是不知道怎么做


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

正确的django-ish方法是:

  • 使用新模型(
    Bar
    )创建架构迁移()-此迁移应只添加
    Bar
    ,而不添加任何实例
  • 创建将数据从旧模型复制到新模型的数据迁移()。您只需循环所有
    Foo
    实例,并根据您的需求创建
    Bar
    实例。如果确实需要,您还可以尝试为此数据迁移创建向后数据迁移(即循环所有
    Bar
    实例并正确更新
    Foo
    实例)。请记住,在运行此迁移时,
    Foo
    Bar
    以及
    Bar\u-id
    Bar\u-data
    字段都位于
    Foo
  • 创建第二个架构迁移,该迁移将从
    Foo
    中删除(删除)不需要的字段(
    bar\u id
    bar\u data

正如我所说,这是正确的,django式的方法。但是,如果您想要快速而肮脏的东西,您可以查看我的文章,仅使用postgresql(使用PL/pgsql)在数据库中进行此类更改:

正确的django-ish方法是:

  • 使用新模型(
    Bar
    )创建架构迁移()-此迁移应只添加
    Bar
    ,而不添加任何实例
  • 创建将数据从旧模型复制到新模型的数据迁移()。您只需循环所有
    Foo
    实例,并根据您的需求创建
    Bar
    实例。如果确实需要,您还可以尝试为此数据迁移创建向后数据迁移(即循环所有
    Bar
    实例并正确更新
    Foo
    实例)。请记住,在运行此迁移时,
    Foo
    Bar
    以及
    Bar\u-id
    Bar\u-data
    字段都位于
    Foo
  • 创建第二个架构迁移,该迁移将从
    Foo
    中删除(删除)不需要的字段(
    bar\u id
    bar\u data
正如我所说,这是正确的,django式的方法。但是,如果您想要快速而肮脏的东西,您可以查看我的文章,仅使用postgresql(使用PL/pgsql)在数据库中进行此类更改: