如何切换 Django OneToOneField 的方向?
How to switch the direction of a Django OneToOneField?
我目前有几个模型是这样设置的:
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 数据库,如果这有什么不同的话。
首先,在子模型中添加一个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 来填充新字段。
最后,删除旧字段,并创建一个新的迁移。
我目前有几个模型是这样设置的:
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 数据库,如果这有什么不同的话。
首先,在子模型中添加一个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 来填充新字段。
最后,删除旧字段,并创建一个新的迁移。