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

Django项目开发环境正常Heroku注册时varchar(40)长度超限如何解决

问题解决思路

根因定位

  1. 报错触发自django-registration-redux库自带的RegistrationProfile模型,而非你自定义的Profile模型:该模型旧版本中的activation_key字段默认长度仅为40,而Django 3.0+默认使用SHA256算法生成账户激活密钥,生成的密钥长度为64位,超出了字段长度限制。
  2. 本地运行正常、Heroku报错的差异原因:你本地开发环境大概率使用SQLite数据库,SQLite对VARCHAR类型的长度限制仅为语法标记,不会做强制校验,超出定义长度的内容也可以正常写入;而Heroku上使用的PostgreSQL数据库会严格校验字段长度,超出限制就会抛出对应错误。

解决步骤

推荐优先使用第一种方案,操作最简便:

  • 升级django-registration-redux到最新正式版本:新版本官方已经修复了这个问题,将activation_key字段的默认长度调整为200,完全可以容纳新算法生成的激活密钥。
    操作流程:
    1. 本地执行命令升级依赖:pip install --upgrade django-registration-redux
    2. 生成针对registration app的迁移文件:python manage.py makemigrations registration
    3. 执行迁移更新数据库字段:python manage.py migrate
    4. 将更新后的依赖列表和迁移文件提交,重新部署到Heroku即可解决问题。
  • 如果你暂时不想升级依赖版本,也可以手动执行SQL修改对应字段长度:登录Heroku的PostgreSQL控制台,执行语句ALTER TABLE registration_registrationprofile ALTER COLUMN activation_key TYPE varchar(200);即可,但后续版本迭代可能重复出现该问题,不推荐长期使用。

额外优化建议

你自定义的Profile模型中,user = models.OneToOneField(User, max_length=250,on_delete=models.CASCADE)这行的max_length=250参数是无效的,OneToOneField为外键类型,长度由关联的User表主键决定,不需要额外指定max_length,可以直接删掉该参数。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 03:33:00