问题是DRF只需将字段值设置到模型上即可。因此,密码在“密码”字段中设置,并保存在数据库中。但是要正确设置密码,你需要调用该
set_password()方法,该方法将进行哈希处理。
有几种方法可以做到这一点,但是在REST framework v3上最好的方法是覆盖序列化器上的
update()和
create()方法。
class UserSerializer(serializers.ModelSerializer): # <Your other UserSerializer stuff here> def create(self, validated_data): password = validated_data.pop('password', None) instance = self.meta.model(**validated_data) if password is not None: instance.set_password(password) instance.save() return instance def update(self, instance, validated_data): for attr, value in validated_data.items(): if attr == 'password': instance.set_password(value) else: setattr(instance, attr, value) instance.save() return instance
这里有两件事:
- 我们使用
self.meta.model
,因此,如果在序列化程序上更改了模型,则它仍然可以工作(只要有某种set_password
方法就可以了)。 - 我们迭代
validated_data
项目而不是字段,以说明可选的excludeed字段。
另外,此版本的create
不会保存M2M关系。在你的示例中不需要,但是可以根据需要添加。你将需要从字典中d出这些文件,保存模型并随后进行设置。
FWIW,因此,我将这个答案中的所有python代码设为全球公共域。它的分发没有任何保证。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)