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
相关产品推荐
相关产品推荐

