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

Django一对一扩展User模型后Admin后台创建用户报唯一约束错误

错误原因

这个报错是重复创建Subscriber关联对象触发了一对一字段的唯一约束:

  • 你定义的post_save信号会在User对象首次创建完成后,自动生成一条关联的Subscriber记录
  • 你给UserAdmin配置了SubscriberInline,管理后台在保存新增的User对象后,会尝试根据Inline表单内容再创建一条关联的Subscriber记录,两条记录关联同一个user_id就触发了唯一性校验失败。

解决方案

两种方案二选一即可:

方案1:保留信号自动创建逻辑,修改Admin配置(推荐)

修改admin.py中的UserAdmin,重写get_inlines方法,新增用户时不加载SubscriberInline,只有编辑已存在的用户时才显示Inline用于修改自定义字段:

class UserAdmin(BaseUserAdmin):
    inlines = (SubscriberInline,)

    def get_inlines(self, request, obj=None):
        # 新增用户时obj为None,不加载SubscriberInline
        if not obj:
            return []
        return super().get_inlines(request, obj)

这个方案的优势是,不管是在Shell还是其他业务代码里创建User,都会自动生成关联的Subscriber对象,符合你当前的信号设计逻辑。

方案2:保留Admin Inline配置,移除自动创建信号

直接删除models.py里两个@receiver装饰的信号函数即可,后续Subscriber对象的创建会由管理后台的Inline表单负责。
注意:这个方案下,如果你在Shell或者其他业务代码里创建User,需要手动创建关联的Subscriber对象,否则访问user.subscriber会抛出RelatedObjectDoesNotExist异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 01:36:02