You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django REST Framework中update方法调用set_password返回None问题

Django REST Framework更新用户密码时set_password返回None的问题解决

你的问题出在对set_password()方法的理解上:Django的User.set_password()方法本身没有返回值(执行后返回None),它的作用是直接修改当前用户实例的password属性为加密后的字符串,不需要手动把它的返回值赋值给instance.password。

你在update方法里写的instance.password = instance.set_password(...),相当于把None赋值给了密码字段,这才导致最终密码变成None。

正确的update方法写法

class CustomUserSerializer(serializers.ModelSerializer):

    def create(self, validated_data):
        user = super().create(validated_data)
        user.set_password(validated_data['password'])
        user.save()
        return user

    def update(self, instance, validated_data):
        # 先处理其他字段的更新
        instance = super().update(instance, validated_data)
        
        # 如果有密码字段,直接调用set_password,不需要赋值
        if password := validated_data.get('password'):
            instance.set_password(password)
            instance.save()
        
        return instance

补充说明

  • 优先调用super().update处理其他字段的更新,避免遗漏默认的字段修改逻辑
  • set_password()会自动完成密码的加密处理,无需手动调用加密方法
  • 建议在序列化器中添加密码验证规则(比如长度、复杂度),避免设置无效密码

内容的提问来源于stack exchange,提问作者expatcz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 04:15:39