如何切换Django OneToOneField的方向?

时间:2015-10-07 15:47:03

标签: django django-models django-migrations

我目前有几个模型设置如下:

from django.db import models

class Child(models.Model):
    child_name = models.CharField(max_length=200)

class Parent(models.Model):
    parent_name = models.CharField(max_length=200)
    child = models.OneToOneField(Child, null=True, blank=True)

不幸的是,这是错误的,因为我希望父级上的删除级联到子级而不是反之亦然,所以我真的应该将它们设置为这样:

class Parent(models.Model):
    parent_name = models.CharField(max_length=200)

class Child(models.Model):
    child_name = models.CharField(max_length=200)
    child = models.OneToOneField(Parent)

假设我目前没有孤儿,我怎样才能设置django迁移,使我的数据保持不变?我使用的是Postgres数据库,如果这有任何区别的话。

1 个答案:

答案 0 :(得分:5)

首先,在保留原始字段的同时,为子模型添加OneToOneField

class Parent(models.Model):
    parent_name = models.CharField(max_length=200)
    child = models.OneToOneField('Child', null=True, blank=True, related_name='+')

class Child(models.Model):
    child_name = models.CharField(max_length=200)
    parent = models.OneToOneField(Parent, null=True, blank=True, related_name='+')

我已设置related_name =' +'这样反向关系不会与其他领域发生冲突。如果为一个或两个字段指定相关名称,您可能会发现数据迁移更容易。

为新字段创建迁移。

然后创建一个data migration来填充新字段。

最后,删除旧字段,然后创建新的迁移。