Serialization djagno rest框架-序列化程序代码未执行
我正在尝试使用密码哈希实现用户注册 问题在于密码是原始保存的(键入时) 出于某种原因,我认为序列化程序中的创建方法没有被调用 不管我是否注释掉该方法,并尝试注册,相同的结果-将用户保存到数据库而不散列密码-意味着代码不会执行 视图.pySerialization djagno rest框架-序列化程序代码未执行,serialization,hash,passwords,django-rest-framework,password-hash,Serialization,Hash,Passwords,Django Rest Framework,Password Hash,我正在尝试使用密码哈希实现用户注册 问题在于密码是原始保存的(键入时) 出于某种原因,我认为序列化程序中的创建方法没有被调用 不管我是否注释掉该方法,并尝试注册,相同的结果-将用户保存到数据库而不散列密码-意味着代码不会执行 视图.py class UserViewSet(mixins.CreateModelMixin, mixins.RetrieveModelMixin, mixins.ListModelMixin,
class UserViewSet(mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.ListModelMixin,
viewsets.GenericViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
permission_classes = (IsCreationOrIsAuthenticated,)
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('username', 'first_name', 'last_name', 'password', )
extra_kwargs = {'password': {'write_only': True}}
def create(self, validated_data):
user = User(
first_name=validated_data['first_name'],
username=validated_data['username'],
last_name=validated_data['last_name']
)
user.set_password(validated_data['password'])
user.save()
return user
Serizliers.py
class UserViewSet(mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.ListModelMixin,
viewsets.GenericViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
permission_classes = (IsCreationOrIsAuthenticated,)
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('username', 'first_name', 'last_name', 'password', )
extra_kwargs = {'password': {'write_only': True}}
def create(self, validated_data):
user = User(
first_name=validated_data['first_name'],
username=validated_data['username'],
last_name=validated_data['last_name']
)
user.set_password(validated_data['password'])
user.save()
return user
我已经为此挣扎了一段时间-不能有密码
有什么想法吗?不要在
serializers.py
中编写create
方法,而是覆盖视图.py
中的perform\u create()
方法。为了在创建对象时做一些额外的工作,DRF提供了这个钩子。这将使代码更加干净和干燥
根据DRF文件
保存和删除挂钩:
以下方法由mixin类提供,并提供
轻松覆盖对象保存或删除行为
执行_create(self,serializer)-当
正在保存新对象实例。执行_更新(自、序列化程序)- 保存现有对象实例时由UpdateModelMixin调用。
perform_destroy(self,instance)-当 正在删除对象实例。
这些钩子对你来说特别有用 设置请求中隐含但不是部分的属性 请求数据的类型 您可以通过以下方式实现: 视图.py
def perform_create(self, serializer):
user = User(
first_name=serializer.data['first_name'],
username=serializer.data['username'],
last_name=serializer.data['last_name']
)
user.set_password(serializer.data['password'])
user.save()
create函数在目标类中,它必须在主类中,删除缩进选项卡
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('username', 'first_name', 'last_name', 'password', )
extra_kwargs = {'password': {'write_only': True}}
def create(self, validated_data):
user = User(
first_name=validated_data['first_name'],
username=validated_data['username'],
last_name=validated_data['last_name']
)
user.set_password(validated_data['password'])
user.save()
return user
您的
create
方法被标记到Meta
类中,而不是序列化器类中。您需要将其解压一次,使其位于正确的行上。请检查缩进中的create()
method哇,这是一个多么愚蠢的错误。。谢谢!现在可以了。谢谢你的回答,但是很明显create方法的缩进有问题。。真蠢