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 --

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...