我的serializers.py
中有简单的序列化程序,我想使用validate(self, data)
验证其中一个字段,但它不起作用。
这是我的代码:
class DataUpdateSerializer(serializers.Serializer):
username = serializers.CharField()
password = serializers.CharField(write_only=True)
def validate(self, data):
if data['username'] != 'test':
raise serializers.ValidationError('Wrong username')
return data
我不知道它是否会有所帮助,但这是我的views.py
class DataUpdateAPI(views.APIView):
serializer_class = DataUpdateSerializer
def post(self, request):
username = request.POST.get('username')
password = request.POST.get('librus_password')
return Response("Just test response")
我不知道这段代码有什么问题。在此先感谢您的帮助!
答案 0 :(得分:1)
首先,你不应该使用你应该使用的request.POST insted,request.data(它更有用)
另外你不应该使用views.APIView,你应该使用generics.UpdateAPIView(因为你是更新字段)
但我不想做你想做的事吗?您想更新测试用户密码吗?
您应该在帖子功能中使用序列化器
def post(self, request)
data = request.data
serializer = DataUpdateSerializer(data=data)
if serializer.is_valid():
return Response("all right")
return Response(data=serializer.errors)
答案 1 :(得分:1)
APIView
是一个不使用serializer_class
属性的低级视图类。如果要使用它,则必须自己实例化并调用序列化程序:
import rest_framework
class DataUpdateAPI(views.APIView):
def post(self, request):
serializer = DataUpdateSerializer(data=request.data)
if serializer.is_valid():
# do smth with serializer.data, it's valid now
return Response("Just test response")
return Response(serializer.errors, status=rest_framework.status.HTTP_400_BAD_REQUEST)
如果您想要更高级别的使用,serializer_class
的调用将在GenericAPIView
和子类中实现。例如,CreateAPIView
已经通过反序列化和验证实现了post
方法,因此您不必重新发明轮子:
class DataUpdateSerializer(serializers.Serializer):
username = serializers.CharField()
password = serializers.CharField(write_only=True)
def validate(self, data):
if data['username'] != 'test':
raise serializers.ValidationError('Wrong username')
return data
def create(self, validated_data):
print('my data is already validated here', validated_data)
class DataUpdateAPI(rest_framework.generics.CreateAPIView):
serializer_class = DataUpdateSerializer