Django 迁移值无效文字

Posted

技术标签:

【中文标题】Django 迁移值无效文字【英文标题】:Django migrate value invalid literal 【发布时间】:2020-02-09 10:01:42 【问题描述】:

我对 Django 迁移功能有疑问。 我试图向我的用户模型添加新字段,它看起来像这样。

class UserProfile(models.Model):
    """ Model to represent additional information about user """
    user = models.OneToOneField(
        User,
        on_delete=models.CASCADE,
        related_name='profile'
    )
    bio = models.TextField(
        max_length=2000,
        blank=True,
        default=''
    )
    # we use URL instead of imagefield because we'll use 3rd party img hosting later on
    avatar = models.URLField(default='', blank=True)
    status = models.CharField(max_length=16, default='', blank=True)
    name = models.CharField(max_length=32, default='')
    balance = models.BigIntegerField(default='0')

    def __str__(self):
        return self.user.username

余额是我添加的新内容,之后我会收到类似的消息

要执行的操作:应用所有迁移:帐户、管理员、身份验证、 authtoken,内容类型,论坛,帖子,会话,线程运行 迁移:正在应用 accounts.0005_userprofile_balance...Traceback (最近一次通话最后):文件“manage.py”,第 15 行,在 execute_from_command_line(sys.argv) 文件“C:\Users\Rade\Desktop\rengorum-master\backend\env\lib\site-packages\django\core\management__init__.py”, 第 371 行,在 execute_from_command_line utility.execute() 文件 "C:\Users\Rade\Desktop\rengorum-master\backend\env\lib\site-packages\django\core\management__init__.py", 第 365 行,执行中 self.fetch_command(subcommand).run_from_argv(self.argv) 文件“C:\Users\Rade\Desktop\rengorum-master\backend\env\lib\site-packages\django\core\management\base.py”,行288, 在 run_from_argv self.execute(*args, **cmd_options) 文件“C:\Users\Rade\Desktop\rengorum-master\backend\env\lib\site-packages\django\core\management\base.py”,第 335 行,在执行 输出 = self.handle(*args, **options) 文件“C:\Users\Rade\Desktop\rengorum-master\backend\env\lib\site-packages\django\core\management\commands\migrate.py” , 第 200 行,在句柄中 fake_initial=fake_initial,文件“C:\Users\Rade\Desktop\rengorum-master\backend\env\lib\site-packages\django\db\migrations\executor.py”, 第 117 行,在迁移中 state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial) 文件 "C:\Users\Rade\Desktop\rengorum-master\backend\env\lib\site-packages\django\db\migrations\executor.py", 第 147 行,在 _migrate_all_forwards state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial) 文件 "C:\Users\Rade\Desktop\rengorum-master\backend\env\lib\site-packages\django\db\migrations\executor.py", 第 244 行,在 apply_migration 中 state = migration.apply(state, schema_editor) File "C:\Users\Rade\Desktop\rengorum-master\backend\env\lib\site-packages\django\db\migrations\migration.py", 第 122 行,申请中 operation.database_forwards(self.app_label, schema_editor, old_state, project_state) 文件 "C:\Users\Rade\Desktop\rengorum-master\backend\env\lib\site-packages\django\db\migrations\operations\fields.py", 第 84 行,在 database_forwards 中 字段,文件“C:\Users\Rade\Desktop\rengorum-master\backend\env\lib\site-packages\django\db\backends\sqlite3\schema.py”, 第 315 行,在 add_field self._remake_table(model, create_field=field) 文件 "C:\Users\Rade\Desktop\rengorum-master\backend\env\lib\site-packages\django\db\backends\sqlite3\schema.py", 第 187 行,在 _remake_table 中 self.effective_default(create_field) 文件 "C:\Users\Rade\Desktop\rengorum-master\backend\env\lib\site-packages\django\db\backends\base\schema.py", 第 240 行,在有效默认值中 默认 = field.get_db_prep_save(默认,self.connection)文件“C:\Users\Rade\Desktop\rengorum-master\backend\env\lib\site-packages\django\db\models\fields__init__.py”, 第 767 行,在 get_db_prep_save 返回 self.get_db_prep_value(value, connection=connection,prepared=False) 文件 "C:\Users\Rade\Desktop\rengorum-master\backend\env\lib\site-packages\django\db\models\fields__init__.py", 第 762 行,在 get_db_prep_value 中 value = self.get_prep_value(value) 文件 "C:\Users\Rade\Desktop\rengorum-master\backend\env\lib\site-packages\django\db\models\fields__init__.py", 第 1826 行,在 get_prep_value 中 return int(value) ValueError: int() 以 10 为底的无效文字:''

收到该消息后,我尝试将默认值设置为 0.00,但它仍然是相同的消息,我删除了余额字段并仍然收到相同的消息。 有什么想法吗?

【问题讨论】:

我知道 default='0' 不正确,但没有 '' 的消息仍然相同 您是否在未声明任何字段选项的情况下尝试过?只是简单的balance = models.BigIntegerField() 【参考方案1】:

这基本上是一个迁移问题,因为迁移文件是根据您的初始代码生成的,并且在迁移时,这些迁移文件正在执行并引发错误。

我认为您可以使用以下任一解决方案来修复它:

解决方案一

首先,您应该删除运行python manage.py makemigrations 时创建的<app>/migrations 目录中的迁移文件(即0003_auto_<some id>.py)。如果您不确定要删除哪一个,请检查数据库中的django_migrations 表并查看它已应用到哪些迁移。删除最后一个(或多个)迁移文件后,您需要将默认值更改为0。然后你应该运行 makemigrations 和 migrate 命令。

解决方案二

在模型中将默认值更改为0。然后更改在模型中添加字段时创建的迁移文件,如下所示:

    operations = [
        migrations.AddField(
            model_name='userprofile',
            name='balance',
            field=models.BigIntegerField(default=0),  # instead of default='0'
        ),

当您修复默认值并重新运行迁移命令时,您还应该删除额外的迁移文件(如果它们已生成)。

【讨论】:

太棒了!!请考虑marking it as answer。【参考方案2】:

BigIntegerField 默认值必须是整数,不能用引号引起来:

balance = models.BigIntegerField(default=0)

或者,如果您需要小数:

balance = models.DecimalField(max_digits=6, decimal_places=2, default=0)

或使用 MoneyField https://github.com/django-money/django-money

【讨论】:

以上是关于Django 迁移值无效文字的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 迁移错误:检测到无效的时间戳文字

Django:在迁移运行时更改设置值

具有默认值的外键上的 Django 1.7 迁移错误

Django 在迁移期间要求默认值

Django 迁移错误:字段“名称”没有默认值

Django迁移默认值可调用生成相同的条目