我得到错误django模型像这样,当我试图makemigrations:
You are trying to add a non-nullable field 'person' to owner without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
1) Provide a one-off default now (will be set on all existing rows)
2) Quit, and let me add a default in models.py
我使用的是django 1.8,这是我的模型:
class Person(models.Model):
user = models.OneToOneField(User)
alphanumeric = RegexValidator(r'^[0-9a-zA-Z]*$', message='hanya yang mengandung karakter alphanumeric')
email = models.EmailField(verbose_name='email address', unique=True, max_length=244)
username = models.CharField(unique=True, max_length=20, validators=[alphanumeric])
first_name = models.CharField(max_length=30, null=True, blank=True)
last_name = models.CharField(max_length=30, null=True, blank=True)
date_of_birth = models.DateTimeField()
date_joined = models.DateTimeField(auto_now_add=True)
USERNAME_FIELD = 'username'
REQUIRED_FIELDS = ['email']
def get_full_name(self):
fullname = self.first_name+" "+self.last_name
return self.fullname
def get_short_name(self):
return self.username
def list_operator(self):
return self.operators.all()
def __str__(self):
return self.email
class Operator(models.Model):
person = models.ForeignKey(Person, related_name="operators", null=True)
alphanumeric = RegexValidator(r'^[0-9a-zA-Z]*$', message='hanya yang mengandung karakter alphanumeric')
email = models.EmailField(verbose_name='email address', unique=True, max_length=244)
username = models.CharField(unique=True, max_length=20, validators=[alphanumeric])
first_name = models.CharField(max_length=30, null=True, blank=True)
last_name = models.CharField(max_length=30, null=True, blank=True)
date_of_birth = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.username;
我想知道我的代码哪里错了。你能帮我解决这个问题吗?
2条答案
按热度按时间ttp71kqs1#
你的代码没有错,只要按照消息提供的说明操作......
Operator
模型中的person
字段不能是null
(因为null=True
没有设置)。您的数据库中必须已经有Operators,所以Django不知道该怎么处理。您需要:(a)在模型中提供
default
值,(B)在迁移过程中提供默认值,或(c)为该字段启用null
值。lndjwyie2#
如果您不希望模型中具有
null=True
属性或手动设置FK示例(有时这不是一项简单的任务),可以执行以下操作:1.从数据库中删除
Person
和Operator
模型的所有示例(例如,使用DjangoAdmin
)。1.设置子模型FK字段的
null=True
(在您的示例中为模型Operator
的字段person
)。1.运行
python manage.py makemigrations
。1.删除第2页中的
null=True
属性。1.再次运行
python manage.py makemigrations
。1.从第5页开始运行
makemigrations
时,需要选择2) Ignore for now. Existing rows that contain NULL values will have to be handled manually, for example with a RunPython or RunSQL operation
。1.运行
python manage.py migrate
。这个方法的主要缺点是你必须删除至少两个模型的所有示例,这并不总是可以接受的。但是,我敢肯定,如果不是你的情况,这是解决这个错误的最好方法。