您正在尝试添加没有默认值的非空字段股票

时间:2019-09-05 07:53:58

标签: django django-models

我在模型中添加了一个新字段,但此后我删除了db.sqlite3(以确保在下面不会出现错误)

agrawalo@:~/myapp> ls
README.md  config  core  manage.py  requirements.txt

但是在运行makemigrations时仍然出现此错误

agrawalo@:~/myapp> ./manage.py makemigrations
You are trying to add a non-nullable field 'high52' to stock 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 with a null value for this column)
 2) Quit, and let me add a default in models.py


class Stock(models.Model):
    name = models.CharField(max_length=255)
    code = models.CharField(max_length=20, db_index=True)
    price = models.DecimalField(max_digits=19, decimal_places=2)
    diff = models.DecimalField(max_digits=19, decimal_places=2)
    open_price = models.DecimalField(max_digits=19, decimal_places=2)
    previous_close = models.DecimalField(max_digits=19, decimal_places=2)
    low52 = models.DecimalField(max_digits=19, decimal_places=2)
    high52 = models.DecimalField(max_digits=19, decimal_places=2)
    last_updated = models.DateTimeField()

    objects = DataFrameManager()

    def save(self, *args, **kwargs):
        ''' On save, update timestamps '''
        self.last_updated = timezone.now()
        return super(Stock, self).save(*args, **kwargs)

    def __str__(self):
        return str(self.code)

low52和high52是新添加的字段。请注意,其他现有字段均不会引发此错误。

3 个答案:

答案 0 :(得分:1)

您需要为blank字段提供nullhigh52 True。

high52 = models.SomeField(blank=True,null=True)

如果您不想这样做,则可以选择这两个选项中的任何一个。

例如,如果high52CharField,则可以选择1选项并提供诸如'..'之类的值,也可以在模型中设置默认值。py

答案 1 :(得分:1)

是否删除数据库文件都没有关系。 makemigrations不检查数据库。

仅当将非空字段添加到模型并进行初始迁移时,才能将其添加到模型。这是因为,在进行了初始迁移之后,Django无法知道是否将应用程序部署在其他地方,因此无法知道是否存在模型实例。一种可能出错的情况:

  1. 在本地计算机上创建模型X并进行迁移。
  2. 将Django应用程序部署到服务器上,该服务器中将填充X型实例。
  3. 删除本地数据库,将不可为空的字段Y添加到模型X中,进行迁移。
  4. 将Django应用程序部署到服务器。
  5. 出现问题。

这里的解决方案是:

  • 将字段设置为null = True
  • 为模型添加默认值。
  • 进行迁移时提供默认设置。

在您的情况下,我想提供一个一次性的默认值是可以的,因为听起来您还没有填充的数据库。

答案 2 :(得分:1)

您可以为该字段提供默认值

high52 = models.DecimalField(max_digits=19, decimal_places=2, default=0.0)

或者您可以将其设为可选

high52 = models.DecimalField(max_digits=19, decimal_places=2, null=True, blank=True)

您可以根据自己的选择做出决定。

要回答有关该错误的问题,可能在初始迁移本身中创建了先前存在的字段,并且它们不需要默认值。但是对于新添加的字段,您需要必填字段的默认值,并且此默认值将填充在现有记录中。这不取决于您是否删除了现有数据库。这取决于该模型的当前迁移状态。由于这不是初始迁移,因此您需要提供默认值或将其设为可选。