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

Django执行migrate时报TypeError: Field 'id' expected a number错误

错误原因

问题出在Event模型的manager外键字段配置错误:你给这个字段设置的默认值是User模型类本身。
Django的ForeignKey字段在数据库底层实际存储的是关联模型的主键值(也就是User表的id字段,为数值类型),迁移时Django会尝试将默认值存入对应的manager_id字段,此时它期望得到一个数字类型的用户ID,实际传入的却是User类(解析过程中误得到User:1实例),因此触发类型错误。

修复步骤
  1. 先删除对应app的migrations目录下,新增manager字段后生成的未生效的错误迁移文件(注意不要删除__init__.py文件)。
  2. 修改Event模型中manager字段的default参数,根据你的需求二选一即可:
    • 方案一:固定默认使用ID为1的用户作为管理员
    # 修改后字段写法
    manager = models.ForeignKey(User, default=1, on_delete=models.SET_NULL,null=True)
    
    • 方案二:动态获取默认用户(避免用户不存在导致的报错)
      先定义可调用的默认值方法,再赋值给default参数:
    # 注意方法要定义在Event模型上方
    def get_default_manager():
        # 可自定义逻辑,比如返回第一个超级用户
        return User.objects.filter(is_superuser=True).first()
    
    class Event(models.Model):
        # 其他字段保持不变
        manager = models.ForeignKey(User, default=get_default_manager, on_delete=models.SET_NULL,null=True)
        # 其他字段保持不变
    
  3. 重新生成迁移文件:
    python manage.py makemigrations
  4. 执行迁移:
    python manage.py migrate
额外优化建议
  • Venue模型中的venue_owner字段目前是IntegerField,如果这个字段是用来关联用户的,建议改成ForeignKey类型,可直接使用Django ORM的关联查询能力,也能避免后续类型不匹配的问题:
    venue_owner = models.ForeignKey(User, on_delete=models.CASCADE, blank=False, default=1)
    
  • Event模型的__str__方法直接调用了self.venue.name,但venue字段允许为null,当场地为空时会触发属性不存在错误,建议增加空值判断:
    def __str__(self):
        return self.event_name + ' at ' + (self.venue.name if self.venue else '未安排场地')
    

内容的提问来源于stack exchange,提问作者BiswajitPaloi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 14:54:03