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 迁移值无效文字的主要内容,如果未能解决你的问题,请参考以下文章