Django外键字段未注册到数据库,migrate迁移时报预期数字却得到字符串错误
问题根因
你为外键字段设置的默认值是字符串类型,但Django的ForeignKey默认存储的是关联模型的主键ID值(默认是自增整数字段),迁移过程中Django尝试将你传入的字符串转为数字存入外键字段,因此抛出Field 'id' expected a number but got 'XD'报错。
解决方案
你可以根据需求选择以下任意一种方案处理:
方案1:使用关联记录的主键ID作为默认值
- 先在数据库中提前创建好你要设为默认的
Tools、Categories记录,查询对应记录的主键ID值,比如name为XD的Tools记录ID为1、name为Coding的Categories记录ID为2,修改外键字段的默认值为对应ID:
item_tool = models.ForeignKey(Tools, default=1, on_delete=SET_DEFAULT) item_category = models.ForeignKey(Categories, default=2, on_delete=models.SET_DEFAULT)
- 提前确认你已经在模型文件顶部导入了
from django.db.models import SET_DEFAULT,避免语法报错。
方案2:将关联表的name字段设为主键
如果你希望直接用name值作为外键的关联依据,可以修改Tools、Categories模型,将name字段设为主键:
class Tools(models.Model): name = models.CharField(max_length=200, primary_key=True) class Meta: verbose_name_plural = 'Tools' def __str__(self): return self.name class Categories(models.Model): name = models.CharField(max_length=200, primary_key=True) class Meta: verbose_name_plural = 'Categories' def __str__(self): return self.name
注意:该方案需要保证name字段的值全局唯一,不能重复,否则会触发主键冲突错误。修改后你原来设置的default='XD'、default='Coding'即可正常生效。
迁移操作注意事项
如果之前已经生成了错误的迁移文件,需要先删除对应app下migrations文件夹中除了__init__.py之外的所有迁移文件,再重新执行以下命令完成迁移:
python manage.py makemigrations python manage.py migrate
内容的提问来源于stack exchange,提问作者Waqart
相关产品推荐
相关产品推荐

