Django rest framework Django Rest框架-在基于模型的API视图中,每个方法单独的序列化程序类

Django rest framework Django Rest框架-在基于模型的API视图中,每个方法单独的序列化程序类,django-rest-framework,Django Rest Framework,假设我有一个简单的Django REST Framework视图,它扩展了多个模型类,并在一个URL端点中提供所有方法: class UserAPIView(RetrieveAPIView、DestroyAPIView、BaseObjectAPIView): 权限\类=(已验证,) serializer\u class=UserSerializer def get_序列化程序_类(self、*args、**kwargs): #根据方法返回不同的序列化程序?? #返回UserUpdateSeria

假设我有一个简单的Django REST Framework视图,它扩展了多个模型类,并在一个URL端点中提供所有方法:

class UserAPIView(RetrieveAPIView、DestroyAPIView、BaseObjectAPIView):
权限\类=(已验证,)
serializer\u class=UserSerializer
def get_序列化程序_类(self、*args、**kwargs):
#根据方法返回不同的序列化程序??
#返回UserUpdateSerializer
返回UserViewSerializer
def get(自我、请求、*args、**kwargs):
"""
检索用户详细信息
"""
# ...
返回响应(数据={'result':“OK”},状态=200)
def删除(自我、请求、主键):
"""
删除用户
"""
# ...
返回响应(数据={'result':“OK”},状态=200)
def put(自我、请求、主键):
"""
更改用户
"""
# ...        
返回响应(数据={'result':“OK”},状态=200)
现在,我需要为每个方法使用不同的序列化程序,因为get方法将使用与put方法不同的字段,例如序列化程序:

class UserViewSerializer(serializers.ModelSerializer):
firstname=serializers.Field(source='firstname')
lastname=serializers.Field(source='lastname')
username=serializers.Field(source='username')
类元:
模型=用户
类UserUpdateSerializer(serializers.ModelSerializer):
firstname=serializers.Field(source='firstname')
lastname=serializers.Field(source='lastname')
类元:
模型=用户
在基于模型的API视图中,是否可以为每个方法使用不同的序列化程序

更新:

我知道如何在方法本身内部使用不同的序列化程序

但我需要获得由Swagger(Django模块)生成的可浏览API,以便为每个方法检索不同的序列化程序。 我可以看到加载API浏览器页面会触发get_serializer_类,但在该方法中,我不知道Swagger试图为哪个方法获取序列化程序


如何让rest\u framework\u swagger为每个方法检索不同的序列化程序?

我认为至少有两种方法可以实现这一点:

  • 只需在每个方法中设置所需的序列化程序。像这样:

    def get(self, request, *args, **kwargs):
        self.serializer_class = UserViewSerializer
        # ...
        return Response(data={'result': "OK"}, status=200) 
    
    def get_serializer_class(self, *args, **kwargs):
        if self.request.method == 'POST':
            return UserUpdateSerializer
        return UserViewSerializer
    
  • 重写get\u Serializer\u类方法。像这样:

    def get(self, request, *args, **kwargs):
        self.serializer_class = UserViewSerializer
        # ...
        return Response(data={'result': "OK"}, status=200) 
    
    def get_serializer_class(self, *args, **kwargs):
        if self.request.method == 'POST':
            return UserUpdateSerializer
        return UserViewSerializer
    
  • 希望这有帮助。

    我想您可以在每个方法上使用重写序列化程序。比如:

    def put(self, request, pk):
        """Change user
    
        ---
        serializer: .serializers.UserUpdateSerializer
        """
        # ...
        return Response(data={'result': "OK"}, status=200)
    

    谢谢不幸的是,我问错了问题。实际上,我需要由Swagger生成的可浏览的webinterface来为每个方法使用不同的序列化程序。但是,当Swagger为API视图获取序列化程序时,无法确定Swagger为哪个方法调用get_serializer_类。也许我会发布一个新的更具体的问题,这不是他所问的,问题是可浏览API使用序列化程序类生成HTML表单,并且每个端点只能使用一个序列化程序类。你有没有找到解决方案?