我有以下模型
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哈希密码?
答案 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
之前,请确保密码不存在或已更改,以不对已经编码的密码进行编码