django要求添加默认值

问题描述 投票:1回答:5

我是django的新手,现在遇到了一些问题。

这是我以前的模特。

class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()

我向该模型添加了一些数据。之后,我又添加了一个字段。现在我的模型如下所示。

class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()
    age = models.IntegerField()

[当我运行命令python manage.py makemigrations时,出现以下明显的错误。

You are trying to add a non-nullable field 'age' to blog 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
Select an option:

我不想添加默认,所以我通过访问db.sqlite3来已删除表内容

但是在运行python manage.py makemigrations之后再次出现相同的错误。为什么?

python django python-3.x
5个回答
3
投票

即使您删除了表,对Django模型的任何更改都将始终引用该模型的先前迁移,因此仍然需要您设置默认值。如果您仍在开发中,则可以删除该模型的迁移,然后再次进行迁移。但是,这是一种可怕的做法,除非您有意识地挤压模型,否则切勿这样做,更好的方法是执行Django告诉您的操作并设置默认值。从长远来看,这将有助于错误处理。

其他答案解决了如何很好地设置默认值。


0
投票

当您向数据库表中添加新字段(即列)时,该字段适用于表中的所有行...现有行和任何新行。如果该字段不能为null,则必须为所有现有行指定一些值。

默认情况下,IntegerField()是不可为空的。这说明了为什么收到警告。您有几种选择:

  • 您可以按照Django的建议选择默认的“一次性”初始值。所有现有的行都会将此值用于新字段。
  • 将您自己的值分配给新字段的每个现有行。
  • 在模型字段中使用blanknull参数,以允许该字段接受空值。

对于最后一个选项,您可以这样做:

models.IntegerField(blank=True, null=True)

但是根据您的用例,这可能不是最佳选择。如果可空值对您的字段没有意义,我将避免使该字段支持空值。


0
投票
age = models.IntegerField(null=True)

Django模型字段默认为null设置为true。


0
投票

您可以解决此问题的方法:

  • 从数据库中删除Blog表。
  • 从包含博客模型的应用程序中删除migrations文件夹。
  • django_migrations表中删除所有数据。
  • 现在运行makemigrations,然后单击migrate命令。

希望这可以解决您的问题。


0
投票

按照Django的要求,然后如果不需要,可以删除default属性。但是无论如何都要保留它是一个好习惯

© www.soinside.com 2019 - 2024. All rights reserved.