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

Django中重写Save方法实现新用户自动创建关联确认模型条目

修正方案

你的代码存在几个关键问题,直接按下面的方式修改即可:

  1. 不要重新定义User类:你写的class User:会覆盖Django自带的User模型,直接导致原有用户系统功能失效,这是核心错误。
  2. 用Django信号实现自动创建关联实例:Django提供的post_save信号,能在User实例保存完成后自动触发操作,这才是扩展用户模型的正确方式。
  3. 修正实例保存的语法错误:创建UserWithConfirmation时要正确完成实例化与保存操作,用objects.create()可以一步到位。

修正后的完整代码:

from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver


class UserWithConfirmation(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="user_with_confirmation")
    is_email_confirmed = models.BooleanField(default=False)

    def __str__(self):
        return self.user.username


@receiver(post_save, sender=User)
def create_user_with_confirmation(sender, instance, created, **kwargs):
    # 仅当新用户创建时生成关联实例,避免更新用户时重复操作
    if created:
        UserWithConfirmation.objects.create(user=instance)

关键说明:

  • @receiver(post_save, sender=User):这个装饰器将函数绑定到User模型的保存完成信号上,User实例保存后会自动触发该函数。
  • created参数:用来判断当前是新建用户还是更新用户,只在新建用户时创建关联的UserWithConfirmation实例。
  • UserWithConfirmation.objects.create(user=instance):通过模型管理器直接创建并保存实例,比手动实例化再调用save()更简洁可靠。

修改后,每次新建用户并保存时,系统会自动生成对应的UserWithConfirmation实例,is_email_confirmed默认值为False,完全符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 03:05:20