django - 如何切换 Django OneToOneField 的方向?

标签 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 数据库,如果这有什么不同的话。

最佳答案

首先,添加一个 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填充新字段。

最后,删除旧字段,并创建一个新迁移。

关于django - 如何切换 Django OneToOneField 的方向?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32996758/

相关文章:

python - django - 重用登录模板

django - 编辑 urls.py 需要重新启动网络服务器吗?

Django-South 未检测到在字段上添加默认值

python - Django:相关模型上的 RunPython 迁移真的很慢

mysql - Django:添加整数字段后在应用程序上运行 makemigrations 时为 "Unknown Column"

django - 如何在django-analytical中使用通用的“analytical。*”标签

python - 使用任意方法或属性作为 Django ModelAdmin 对象的字段?

python - 如何使模型中的整数字段固定为十个数字输出

django - 如何从未强制执行引用完整性的模型中选择孤立记录?

python - django 在生产中不运行特定的迁移(它跳过)