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

Django中create()与create_user()方法差异及字段赋值疑问

自定义User模型中create()自动赋值date字段,但create_user()需手动传参的原因

核心问题是你代码里的笔误和错误配置:

  1. 你的User模型里定义的是data = models.DateTimeField(auto_now_add=True)(也就是你说的date字段),但你在REQUIRED_FIELDS里添加了一个模型根本不存在的create字段,同时自定义的create_user方法还把create设成了必填参数。
  2. 用User.objects.create()时,Django ORM只处理模型实际存在的字段,auto_now_add=True的data会自动赋值,而create不是模型字段,你调用create时根本不会传这个参数,所以没问题。
  3. 但create_user是你自定义的管理器方法,你自己要求必须传create参数,再加上REQUIRED_FIELDS里包含了这个不存在的字段,Django的BaseUserManager会校验这些字段必须被提供,所以你调用create_user时不得不手动传create值。

修正方案

把代码里的笔误和错误配置改掉就行:

class UserManager(BaseUserManager):
    def create_user(self, email, f_name, l_name, phone, password):
        # 移除多余的create参数
        user = self.model(
            email=self.normalize_email(email), 
            f_name=f_name, 
            l_name=l_name, 
            phone=phone
        )
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, f_name, l_name, phone, password):
        # 同步移除create参数
        user = self.create_user(email, f_name, l_name, phone, password)
        user.is_admin = True
        user.is_superuser = True
        user.save(using=self._db)
        return user


class User(AbstractBaseUser):
    f_name = models.CharField(max_length=50)
    l_name = models.CharField(max_length=50, blank=True, null=True)
    email = models.EmailField(unique=True, blank=True, null=True)
    phone = models.BigIntegerField(blank=True, null=True)
    data = models.DateTimeField(auto_now_add=True)
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    permission = models.ManyToManyField(Permission, related_name='users')
    
    USERNAME_FIELD = 'email'
    # 从必填字段列表里移除不存在的create
    REQUIRED_FIELDS = ['phone', 'f_name', 'l_name']
    objects = UserManager()

这样修改后,调用create_user时就不需要传create参数,data字段也会像用create()时一样自动赋值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 04:35:27