我有一个模特
class Mystery(models.Model):
first = models.CharField(max_length=256)
second = models.CharField(max_length=256)
third = models.CharField(max_length=256)
player = models.ForeignKey(Player)
我添加了播放器ForeignKey但是当我尝试使用South迁移它时,我似乎无法创建这个whith一个null = False . 我有这样的信息:
字段'Mystery.player'没有指定默认值,但是NOT NULL . 由于您要添加此字段,因此必须指定用于现有行的默认值 . 是否要:1 . 立即退出,并在models.py中的字段中添加默认值2.指定现在用于现有列的一次性值
我用这个命令:
manage.py schemamigration myapp --auto
非常感谢 !
3 回答
另一个选择是在添加ForeignKey之前创建data migration,在其中创建具有特定id的新Player实例 . 请确保以前数据库中不存在该ID .
1.创建数据迁移文件
2.编辑文件的前向和后向方法:
3.将ForeignKey添加到您的Mistery类并再次迁移架构 . 它会询问您的数据迁移ID的默认值,在本例中为34 .
4.最后运行migrate命令,它将按顺序执行迁移,插入新的Player并使用对新Player的引用更新所有Mistery行 .
这最好在3次迁移中完成 .
步骤1.创建新模型并允许玩家为空:
player = models.ForeignKey(Player, null=True)
第2步 . 运行
./manage.py schemamigration <app> --auto
第3步 . 运行
./manage.py datamigration <app> set_default_players
步骤4.在
<app>/migrations/<number>_set_default_players.py
中向前和向后更新以使用您喜欢的任何逻辑来设置默认播放器 . 确保每个Mystery
对象都具有player
的值 .步骤5.更新
Mystery
模型,使player
具有null=False
.步骤6.运行
./manage.py schemamigration <app> --auto
步骤7.运行
./manage.py migrate <app>
如果你的数据库已经包含Mystery对象,那么南必须知道,
player
字段中放入了什么值,因为它不能为空 .一种可能的方案:
选择
然后输入1.因此,所有现有的Mystery对象现在将指向具有pk = 1的播放器 . 然后您可以在管理页面中更改(如果需要) .