Django错误“添加一个非空字段”

8zzbczxx  于 2023-03-09  发布在  Go
关注(0)|答案(2)|浏览(120)

我得到错误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;

我想知道我的代码哪里错了。你能帮我解决这个问题吗?

ttp71kqs

ttp71kqs1#

你的代码没有错,只要按照消息提供的说明操作......
Operator模型中的person字段不能是null(因为null=True没有设置)。您的数据库中必须已经有Operators,所以Django不知道该怎么处理。
您需要:(a)在模型中提供default值,(B)在迁移过程中提供默认值,或(c)为该字段启用null值。

lndjwyie

lndjwyie2#

如果您不希望模型中具有null=True属性或手动设置FK示例(有时这不是一项简单的任务),可以执行以下操作:
1.从数据库中删除PersonOperator模型的所有示例(例如,使用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
这个方法的主要缺点是你必须删除至少两个模型的所有示例,这并不总是可以接受的。但是,我敢肯定,如果不是你的情况,这是解决这个错误的最好方法。

相关问题