我有简单的乡村和城镇模型:
from django.db import models
class Country(models.Model):
name = models.CharField(max_length=50)
class Town(models.Model):
belongs_to = models.ForeignKey(country, on_delete=models.CASCADE)
name = models.CharField(max_length=50)
现在,我想玩一下......我想加入大陆。我想从一开始就是正确的做法:
from django.db import models
class Continent(models.Model):
name = models.CharField(max_length=50)
class Country(models.Model):
belongs_to = models.ForeignKey(continent, on_delete=models.CASCADE)
name = models.CharField(max_length=50)
class Cown(models.Model):
belongs_to = models.ForeignKey(country, on_delete=models.CASCADE)
name = models.CharField(max_length=50)
如果我这样做并保存文件,请将admin.py中的大陆添加到admin.site.register(大陆),从makemigrations开始...我明白了:
您正在尝试添加一个不可为空的字段'属于'没有违约的国家;我们不能这样做(数据库需要som 用来填充现有行的东西)。 请选择修复:
1。)现在提供一次性默认值(将在所有现有行上设置 使用此列的空值)2。)退出,让我添加一个 models.py
中的默认值我被困在这里,因为我不知道该怎么办?
答案 0 :(得分:4)
我认为你得到的信息非常自我解释。
您正在将belongs_to
字段添加到country
模型中(类应使用第一个大写字母命名,尽管如此Country
),但它被声明为不可为空。也就是说,必须声明一个值。
现在,因为您已经填充了country
模型的某些行(对象),Django会询问您belongs_to
应该添加到这些现有行的值。
有两种解决方案:
id
模型的continent
)并稍后进行更改,或者belongs_to = models.ForeignKey(continent, on_delete=models.CASCADE, null=True, blank=True)
,以便在migrate
此字段 可以为空之后,现有行将该字段设为null
。希望你明白。
答案 1 :(得分:1)
我经常为此苦苦挣扎。感谢@nik_m的回答,我可以找出(经过一些测试和失败之后)最简单的方法,即从已经有对象的模型中为没有对象的模型添加新的ForeignKey。
null=True, blank=True
替换为default=1
来更改外键字段,以将您创建的新对象与所有现有行相关联。default=1
,以强制每个新对象在创建时声明外键。