猿问

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

我有以下模型


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 散列密码?


翻过高山走不出你
浏览 195回答 2
2回答

三国纷争

您可以在序列化程序类中执行此操作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' 可以是你想要的任何函数然后在视图中保存序列化程序

慕田峪4524236

如果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以不对已编码的密码进行编码
随时随地看视频慕课网APP

相关分类

Python
我要回答