python - AssertionError: .validate() 应该返回经过验证的数据
问题描述
我能够访问 validate() 函数的 user_queryset PasswordChangeSerializer
,但是我仍然收到此错误:
断言值不是无,'.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
视图.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
条件内。把它放在 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)
推荐阅读
- javascript - 使用 Datatables 列可见性和 stateSave 时如何保留或调用外部复选框状态
- python - 通过省略循环和强制转换来优化 numpy 最小二乘
- python - 如何检查字段是否在 pymongo 的特定文档中?
- angular - Socket.io 未在客户端接收消息
- c - gcc 会优化一个常量变量的开关吗
- oracle - 如何在 Oracle SQL 中将时间转换为数字
- sql - 如何在插入相同值的同时安全地自动增加一组行?
- json - 两个不同 Angular 模型之间的映射
- javascript - 如何提供大于 26 的自动调整大小功能?
- python - 删除手机 Discord.py