Django执行migrate时报TypeError: Field 'id' expected a number错误
错误原因
问题出在Event模型的manager外键字段配置错误:你给这个字段设置的默认值是User模型类本身。
Django的ForeignKey字段在数据库底层实际存储的是关联模型的主键值(也就是User表的id字段,为数值类型),迁移时Django会尝试将默认值存入对应的manager_id字段,此时它期望得到一个数字类型的用户ID,实际传入的却是User类(解析过程中误得到User:1实例),因此触发类型错误。
修复步骤
- 先删除对应app的
migrations目录下,新增manager字段后生成的未生效的错误迁移文件(注意不要删除__init__.py文件)。 - 修改
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) # 其他字段保持不变 - 重新生成迁移文件:
python manage.py makemigrations - 执行迁移:
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
相关产品推荐
相关产品推荐

