【问题标题】:Adding fields to existing model doesn't work in Django将字段添加到现有模型在 Django 中不起作用
【发布时间】:2016-05-03 07:49:14
【问题描述】:

我已经用 OneToOneField 和 User-model 创建了自己的模型。现在,我想向该模型添加字段,但执行 manage.py makemigrations 和 migrate 并没有看到任何更改,我对我的 models.py 进行了更改。

models.py:

class UserDetails(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE,)
    footsize = models.CharField(max_length=10)
    headsize = models.CharField(max_length=10)

    handsize = models.CharField(max_length=100) #field what I want to add

    def __str__(self):
        return u'%s %s %s' % (self.id, self.footsize, self.headsize)

如果我尝试使用 shell 将值添加到 handsize,我会收到一个错误,即 handsize 字段不存在。有什么问题?

【问题讨论】:

  • 这是此应用的第一次迁移吗?
  • 你在django设置中installed_apps下添加应用了吗?
  • @r3ign 是的,我有
  • @Sayse 不,我以前做过。
  • 你使用什么命令进行 makemigrations ?你能把它贴在这里吗?

标签: python django sqlite django-models


【解决方案1】:

我用我的备份测试做了与我的问题相同的事情。终端显示此消息,当做makemigrations:

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

我敢肯定,我之前用 1) 回答过,这就是为什么字段没有显示在数据库中的原因。所以,现在我回答了 2) 并在字段中添加了默认值:

    handsize = models.CharField(max_length=10, default='40')

现在migrate 工作并将handsize 作为新字段添加到数据库。

【讨论】:

    【解决方案2】:

    当您说您已经创建了模型时,我假设您运行了初始迁移。因此,在放入新字段后再次运行迁移时,您无法运行全面迁移。您必须在 makemigrations 之后指定应用程序名称。像这样。

    ./manage.py makemigrations app_name
    

    和

    ./manage.py migrate.
    

    应该可以。

    【讨论】:

      猜你喜欢
      • 2010-10-24
      • 2018-05-08
      • 2011-06-07
      • 2023-03-15
      • 1970-01-01
      • 2018-11-01
      • 2018-05-25
      • 1970-01-01
      • 2012-02-09
      相关资源
      最近更新 更多