Django中create()与create_user()方法差异及字段赋值疑问
自定义User模型中create()自动赋值date字段,但create_user()需手动传参的原因
核心问题是你代码里的笔误和错误配置:
- 你的User模型里定义的是
data = models.DateTimeField(auto_now_add=True)(也就是你说的date字段),但你在REQUIRED_FIELDS里添加了一个模型根本不存在的create字段,同时自定义的create_user方法还把create设成了必填参数。 - 用
User.objects.create()时,Django ORM只处理模型实际存在的字段,auto_now_add=True的data会自动赋值,而create不是模型字段,你调用create时根本不会传这个参数,所以没问题。 - 但
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
相关产品推荐
相关产品推荐

