Django项目PostgreSQL出现integer out of range错误如何解决?
解决Django+PostgreSQL中
integer out of range错误 问题原因
你遇到的django.db.utils.DataError: integer out of range错误,核心原因是手机号超出了PostgreSQL中IntegerField对应的整数范围:
- Django的
IntegerField在PostgreSQL里映射为int4类型,取值范围是-2147483648到2147483647(最多10位数字)。 - 国内手机号通常是11位数字,数值远大于
2147483647,插入时就会触发超出范围的错误。
解决方案
最合理的修复方式是修改模型字段类型,推荐两种方案:
方案1:改用CharField(推荐)
手机号本质是字符串(无需做数值运算,可能包含区号等非数字字符),直接存储字符串更合适:
class Enquiry(models.Model): product_name = models.CharField(max_length=100) product_id = models.ForeignKey(List, on_delete=models.CASCADE) user_name = models.CharField(max_length=100) user_email = models.CharField(max_length=50) user_address = models.CharField(max_length=200) # 修改为CharField,设置足够长度适配不同地区手机号 user_mobile = models.CharField(max_length=20, default='0')
方案2:改用BigIntegerField
如果一定要以数值形式存储,可改用支持更大范围的BigIntegerField(对应PostgreSQL的int8,范围是-9223372036854775808到9223372036854775807):
class Enquiry(models.Model): # 其他字段不变 user_mobile = models.BigIntegerField(default=0)
执行迁移修改数据库
修改模型后,需要更新数据库结构:
- 生成迁移文件:
python manage.py makemigrations
- 应用迁移到数据库:
python manage.py migrate
额外检查
如果修改字段后仍报错,确认传入的user_mobile值是否符合新字段的要求:
- 用
CharField时,确保传入的是字符串类型(或可转为字符串的合法内容); - 用
BigIntegerField时,确保数值未超出int8的范围。
内容的提问来源于stack exchange,提问作者Shaheem PP
相关产品推荐
相关产品推荐

