为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 django rest 中调用 .create 之前更改数据

如何在 django rest 中调用 .create 之前更改数据

翻过高山走不出你 2021-09-25 09:53:41
我有以下模型class User(models.Model):    UserName = models.CharField(max_length=20)    Password = models.CharField(max_length=255)    RoleName = models.CharField(max_length=30)    Email = models.EmailField(max_length=50)    ApartmentName = models.CharField(max_length=50)    UserId = models.BigAutoField(primary_key=True)我通过调用这个视图保存了数据class Register(generics.CreateAPIView):    serializer_class = serializers.UserSerializer    def get_queryset(self, *args, **kwargs):        return models.User.objects.all()    def post(self, request, *args, **kwargs):        return self.create(request, *args, **kwargs)但是在要在数据库表中创建行之前,我需要将密码更改为散列形式,我无法更改请求中的 post 变量,因为它是不可变的。如何在保存数据之前使用 make_password 散列密码?
查看完整描述

2 回答

?
三国纷争

TA贡献1804条经验 获得超7个赞

您可以在序列化程序类中执行此操作


class UserSerializer(ModelSerializer):


    class Meta:

        model=User

        fields = ('Username', 'Password', #others)


   def create(self, validated_data):

       user = User()

       user.Username = validated_data['Username']

       user.Password = make_password(validated_data['Password'])

       # other

'make_password' 可以是你想要的任何函数


然后在视图中保存序列化程序


查看完整回答
反对 回复 2021-09-25
?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

如果User对象仅从Register视图创建,则覆盖工作正常的create方法UserSerializer。但是,通过其他方式(管理界面、django 表单、管理命令等)创建的用户不会加密他们的密码,除非您提供一些代码来以所有这些方式进行加密。


要在保存任何用户之前散列密码,更好pre_save的save方法是创建一个信号或覆盖User散列密码的方法(序列化程序和视图不会改变)


class User(models.Model):

    ...


    def save(self, **kwargs):

        self.password = make_password(self.password)

        return super(User, self).save(**kwargs)

在调用之前确保密码不存在或已更改,make_password以不对已编码的密码进行编码


查看完整回答
反对 回复 2021-09-25
  • 2 回答
  • 0 关注
  • 194 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号