默认DRF资源仅限于接受稍后返回的同一对象。我想为输入使用不同的序列化器而不是输出。例如,我想通过在返回新用户对象时接受用户名和密码来实现用户注册。是否可以使用不同的串行器进行输入和输出?
class UserListView(generics.ListAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
class ImaginarryUserInputSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('username', 'password', 'password_confirmation')
class ImaginaryUserOutputSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'registration_date')
答案 0 :(得分:20)
我的问题是我想为服务的输入和输出设置不同的序列化器。
为不同的请求方法提供不同的序列化器很容易(例如,响应与PUT
,POST
等不同的GET请求...
只需覆盖get_serializer_class()
,然后根据self.request.method
的值返回其他序列化程序类。
这可能不是您正在寻找的东西,因为当您输入PUT或POST数据时,您仍然会得到与您提供的相同的输出样式。
在这种情况下,您应该只是明确地编写视图而不是依赖于默认的通用视图,这些都是这些......
class UserCreateOrListView(views.APIView):
def get(self, request, *args, **kwargs):
serializer = ImaginaryUserOutputSerializer(User.objects.all())
return Response(serializer.data)
def post(self, request, *args, **kwargs):
serializer = ImaginaryUserInputSerializer(data=request.DATA)
if serializer.is_valid():
user = serializer.save()
output_serializer = ImaginaryUserOutputSerializer(user)
return Response(output_serializer.data)
else:
return Response(serializer.errors, 400)
etc...
同样值得在mailing list上询问,因为其他用户可能正在做类似的事情并且有共享的有用模式。
答案 1 :(得分:0)
Django的解决方案之一是TastyPie,例如:
Resource.alter_deserialized_detail_data()
- 允许您在进一步解释之前更改传入的单一资源结构,Resource.alter_detail_data_to_serialize()
- 允许您在序列化之前更改出站单一资源结构,序列化/反序列化列表时也是如此:Resource.alter_deserialized_list_data()
和Resource.alter_list_data_to_serialize()
。
注意:但我相信Django REST Framework可能会(甚至可能)实现类似的功能。 DRF相对较新,最近面临一些重大的重构。 Django REST Framework在Django社区中有很好的意见,并且看起来有很有洞察力的开发团队,所以也许你应该考虑询问他们的开发人员或提出改进建议。当然,如果您在StackOverflow上找不到任何帮助(或者在这里遇到DRF开发人员的一些答案)。