Django的要求,以添加默认值

时间:2019-02-02 18:21:46

标签: python django python-3.x

我是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之后,我仍然遇到相同的错误。为什么?

5 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

默认情况下,IntegerField()是不可为空。这就解释了为什么你所得到的警告。您有几种选择:

  • 可以选择一个默认的“一次性”的初始值等的Django暗示。所有现有的行都会将此值用于新字段。
  • 分配自己的价值观,以每个现有行的新领域。
  • 使用blanknull在模型字段参数,可以现场接受空值。

对于最后一个选项,您需要这样做:

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

但是,这可能不是取决于你的使用情况的最佳选择。如果可为空的值对您的字段没有意义,那么我将避免使该字段支持null。

答案 2 :(得分:0)

age = models.IntegerField(null=True)

Django模型字段是空值设置为true默认情况下。

答案 3 :(得分:0)

解决此问题的方法:

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

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

答案 4 :(得分:0)

按照Django的要求进行操作,然后在不需要时可以删除default属性。但这还是一个好习惯