问题描述
我有以下 Django 模型:
class TCDUser(AbstractUser):
is_change_password = models.BooleanField(_("Cambiar Password?"),default=True)
groups = models.ManyToManyField(Group,default=[],related_name='users',verbose_name=_("Grupos"))
class Meta:
verbose_name = _("Usuario")
verbose_name_plural = _("Usuarios")
def __str__(self):
return "[{}]{}".format(self.pk,self.username)
def save(self):
create = True if self.id is None else False
if create:
self.set_password(self.password)
super(CustomModel).save()
这是序列化器:
class TCDUserSerializer(CustomModelSerializer):
class Meta:
model = models.TCDUser
fields = ('id','username','email','first_name','last_name','is_staff','is_active','is_superuser','password','is_change_password','groups')
当我向常规 DRF ModelViewSet 发送 POST 时,出现此异常:
TypeError: Got a `TypeError` when calling `TCDUser.objects.create()`. This may be because you have a writable field on the serializer class that is not a valid argument to `TCDUser.objects.create()`. You may need to make the field read-only,or override the TCDUserSerializer.create() method to handle this correctly.
...
TypeError: save() got an unexpected keyword argument 'force_insert'
如果我去掉调用super(CustomModel).save()
,异常就没有了,但是我需要在创建用户的时候设置密码。
解决方法
-
你应该调用
super(TCDUser,self).save()
而不是super(CustomModel).save()
-
错误
TypeError: save() got an unexpected keyword argument 'force_insert'
不言自明,您还应该将*args
和**kwargs
传递给重写的方法save()
。
class TCDUser(AbstractUser):
[..]
def save(self,*args,**kwargs): # -- HERE --
create = True if self.id is None else False
if create:
self.set_password(self.password)
super(TCDUser,self).save(*args,**kwargs) # -- HERE --