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
相关产品推荐
相关产品推荐

