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

Django部署Heroku生产环境删除用户触发500错误排查问询

问题排查与解决方法

第一步:获取完整错误栈

你当前的Heroku日志只记录了请求状态,没有输出Django的错误回溯,建议优先用以下两种方法拿到具体报错:

  • 直接在生产Shell中模拟删除操作:执行 heroku run python manage.py shell 进入Django交互环境,执行以下代码:
    from accounts.models import User
    # 替换为你要删除的测试用户ID
    user = User.objects.get(id=xxx)
    user.delete()
    
    执行后会直接输出完整的错误回溯信息,可直接定位问题根因。
  • 配置Django日志输出到控制台:在生产环境的settings.py中添加如下日志配置,后续报错会将完整栈信息打印到Heroku日志中:
    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'handlers': {
            'console': {
                'class': 'logging.StreamHandler',
            },
        },
        'loggers': {
            'django.request': {
                'handlers': ['console'],
                'level': 'ERROR',
                'propagate': True,
            },
        },
    }
    

大概率根因分析

结合你给出的场景和代码,优先排查以下两点:

  1. 存在未公开的其他模型关联了User模型,且外键设置了on_delete=models.PROTECT
    你给出的StripeRecord外键设置了SET_NULL,删除用户时不会触发报错,但如果有其他你没贴出来的模型,关联User时用了PROTECT策略,生产环境的用户刚好存在关联的该模型数据,删除时就会抛出ProtectedError导致500。而开发环境的测试用户没有对应关联数据,所以删除正常,完全匹配你现在的现象。
  2. User模型绑定了pre_delete/post_delete信号,信号处理逻辑在生产环境触发报错
    如果你的代码中给User模型写了删除信号的处理函数,且逻辑里依赖只有生产环境才有的配置/数据,就会出现开发环境删除正常、生产删除失败的情况。
  3. User模型的date_time字段定义问题(概率较低)
    你当前User模型的date_time字段写的是default=datetime.datetime.now(),这种写法会在Django进程启动时就固定默认值,虽然大概率不会影响删除操作,但建议修正为default=datetime.datetime.now(去掉括号,传递函数本身而非执行结果),避免后续出现时间相关的异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 21:45:04