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

自定义User模型后Django后台删用户触发RecursionError求助

解决Django自定义用户模型删除时的递归错误

问题根源

从报错回溯可以明确,递归循环的触发点在main/models.py的__init__方法中:

self.__initial_first_name = self.first_name
self.__initial_last_name = self.last_name

当Django执行删除操作需要从数据库加载用户对象时,会调用模型的from_db方法创建实例,而自定义__init__中直接访问模型字段(如self.first_name)会触发refresh_from_db,后者又会重新创建实例,最终导致无限递归。

解决方案

1. 移除或调整自定义__init__方法

如果你的UserAccount模型中添加了上述自定义__init__来记录字段初始值,直接移除该方法即可。若需要追踪字段变化,改用以下替代方案:

  • 使用pre_save信号在保存前记录初始值
  • 在模型save方法中对比字段变化

示例(信号实现):

from django.db.models.signals import pre_save
from django.dispatch import receiver
from .models import UserAccount

@receiver(pre_save, sender=UserAccount)
def track_user_changes(sender, instance, **kwargs):
    if instance.pk:
        original = sender.objects.get(pk=instance.pk)
        instance.__initial_first_name = original.first_name
        instance.__initial_last_name = original.last_name
    else:
        instance.__initial_first_name = instance.first_name
        instance.__initial_last_name = instance.last_name

2. 修正Admin配置的字段错误

你的UserAdminConfig中fieldsets包含about字段,但UserAccount模型未定义该字段,会导致管理界面报错,需移除该字段:

fieldsets = (
    (None, {'fields': ('email', 'first_name','last_name')}),
    ('Permissions', {'fields': ('is_staff', 'is_active', 'is_verified')}),
    # 删除不存在的'about'字段配置
)

3. 验证修复效果

重启Django服务后,进入admin界面尝试删除用户,确认递归错误消失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 23:55:31