【问题标题】:Django model override save() method raises error when calling super()调用 super() 时 Django 模型覆盖 save() 方法引发错误
【发布时间】:2021-04-10 11:35:37
【问题描述】:

我有以下 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(),异常就没有了,但是我需要在创建用户的时候设置密码。

【问题讨论】:

    标签: django django-models django-rest-framework django-users


    【解决方案1】:
    • 你应该打电话给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 --
    

    【讨论】:

    • 不,同样的例外。
    猜你喜欢
    • 1970-01-01
    • 2021-11-21
    • 2019-06-10
    • 2012-02-21
    • 1970-01-01
    • 2018-12-08
    • 2012-05-01
    • 1970-01-01
    • 2011-09-28
    相关资源
    最近更新 更多