Python AssertionError:.validate()应返回已验证的数据
我能够访问Python AssertionError:.validate()应返回已验证的数据,python,django,django-rest-framework,Python,Django,Django Rest Framework,我能够访问PasswordChangeSerializer的validate()函数的用户\u queryset,但是我仍然收到此错误: 断言值不是None,'.validate()应返回已验证的数据' 序列化程序.py class PasswordChangeSerializer(serializers.ModelSerializer): old_password = serializers.CharField(write_only=True, required=True, max_
PasswordChangeSerializer
的validate()函数的用户\u queryset,但是我仍然收到此错误:
断言值不是None,'.validate()应返回已验证的数据'
序列化程序.py
class PasswordChangeSerializer(serializers.ModelSerializer):
old_password = serializers.CharField(write_only=True, required=True, max_length=30)
new_password = serializers.CharField(write_only=True, required=True, max_length=30)
confirm_password = serializers.CharField(write_only=True, required=True, max_length=30)
class Meta:
model = User
fields = ['old_password', 'new_password', 'confirm_password']
def validate(self, data):
old_password = data['old_password']
new_password = data['new_password']
confirm_password = data['confirm_password']
user_queryset = User.objects.all()
if user_queryset.exists() and user_queryset.count() == 1:
user_set = user_queryset.first()
if not user_set.check_password(old_password):
raise serializers.ValidationError({'old_password': 'Wrong password!'})
if confirm_password != new_password:
raise serializers.ValidationError({'password': 'Password must be confirmed correctly!'})
return data
def update(self, instance, validated_data):
instance.set_password(validated_data['new_password'])
instance.save()
return instance
views.py
class PasswordChangeAPIView(APIView):
permission_classes = [IsAdminUser]
serializer_class = PasswordChangeSerializer
def post(self, request, format=None):
data = request.data
password_ser = PasswordChangeSerializer(data=data)
if password_ser.is_valid():
password_ser.save()
new_data = password_ser.data
return Response(new_data, status=HTTP_201_CREATED)
else:
return Response({"msg":"invalid user!"}, status=HTTP_400_BAD_REQUEST)
您只需要返回数据。您已将return语句保留在
if
条件中。只要把它放在条件之外就行了
def validate(self, data):
old_password = data['old_password']
new_password = data['new_password']
confirm_password = data['confirm_password']
user_queryset = User.objects.all()
if user_queryset.exists() and user_queryset.count() == 1:
self.user_set = user_queryset.first()
if not self.user_set.check_password(old_password):
raise serializers.ValidationError({'old_password': 'Wrong password!'})
if confirm_password != new_password:
raise serializers.ValidationError({'password': 'Password must be confirmed correctly!'})
return data
并改变你的观点如下
class PasswordChangeAPIView(APIView):
permission_classes = [IsAdminUser]
serializer_class = PasswordChangeSerializer
def post(self, request, format=None):
data = request.data
password_ser = PasswordChangeSerializer(data=data)
if password_ser.is_valid():
user = password_ser.user_set
user.set_password(data['new_password'])
user.save()
return Response(new_data, status=HTTP_201_CREATED)
else:
return Response({"msg":"invalid user!"}, status=HTTP_400_BAD_REQUEST)
然后我得到了这个错误<代码>类型错误:调用User.objects.create()时在
PasswordChangeAPIView
中调用user\u set
的位置?self.user\u set=user\u queryset.first()@satyajitbarik它已经更新了。请在列表中检查,然后。。。我得到AttributeError:'PasswordChangeSerializer'对象没有属性'user\u set'