如何在Django Rest中调用.create之前更改数据

时间:2018-12-25 04:30:44

标签: python django django-rest-framework

我有以下模型

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 个答案:

答案 0 :(得分:1)

您可以在序列化程序类中完成

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”可以是您想要的任何功能

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

答案 1 :(得分:0)

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

要在保存任何用户之前对密码进行哈希处理,一个更好的方法是创建一个pre_save信号或重写UserSerializer的{​​{1}}方法来对密码进行哈希处理(序列化器和视图不会更改)

save

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