【问题标题】:How to add one to one relation field in a existing model through South migration如何通过南迁移在现有模型中添加一对一的关系字段
【发布时间】:2012-01-25 01:56:33
【问题描述】:

我已经有模特了,

class ModelA( models.Model ):
    name = models.CharField ( max_length = 255, blank = False )

我有很多条目。现在我想在其中添加一个字段,即

user = models.OneToOneField( User )

如何将此字段添加到ModelA?除了删除所有以前的条目之外,还有其他解决方案吗?

【问题讨论】:

  • 还有什么问题? --auto 不起作用?
  • --auto 有效,但要求为以前的条目提供默认值?
  • user 字段为 unique=Truenull=False
  • 如果要删除之前的所有条目,只需在迁移之前将其删除即可。 :-)
  • @szaman OneToOneFieldunique=True 所以 db 中不允许有多个空条目

标签: django django-south


【解决方案1】:

我会使用这种模式:

  1. 将“user = models.OneToOneField(User, null=True)”添加到您的模型中(不要删除“名称”字段)
  2. 运行“manage.py schemamigration --auto”。并应用迁移。现在您的表格中有两列。
  3. 现在创建一个数据迁移。编辑文件:您需要遍历模型中的所有对象并设置用户字段。
  4. 从 model.py 文件中删除“name=models.CharField”。并从用户字段中删除 null=True。
  5. 运行“manage.py schemamigration --auto”。并应用迁移

顺便说一句,如果您使用 OneToOneField() 而不使用 null=True,则可以在此字段上设置 primary_key=True,因为它必须是唯一的。但我不知道南方是否可以处理这种迁移。

【讨论】:

  • 在第 5 步之后,当我要迁移时,迁移要求为用户添加默认值,因为它会从 NULL 状态变为 NOT NULL。那么默认值是多少呢?空字符串不起作用:(
  • 尝试 0,或编辑创建架构迁移文件并在此处设置默认值 0。
  • 完全相同的方法适用于 Django 迁移(没有 South),第 2 步和第 5 步使用“python manage.py makemigrations”。谢谢!
猜你喜欢
  • 2020-09-19
  • 2014-12-08
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
  • 2017-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多