如何解决Django 模型覆盖 save() 方法在调用 super() 时引发错误
我有以下 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 --
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。