You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 09:24:01