首页 > 解决方案 > 设置条件序列化程序类删除自定义序列化程序类以在 Django 休息框架中进行额外操作

问题描述

我有一个模型视图集和几个额外的操作。

class TestViewset(
    mixins.RetrieveModelMixin,
    mixins.ListModelMixin,
    mixins.UpdateModelMixin,
    GenericViewSet,
):
    permission_classes = [CustomPermissionClass]

    def get_serializer_class(self) -> Type[ModelSerializer]:
    
        if self.action == "list" or self.action == "get":
            return FirstSerializer
        return SecondSerializer


    @action(
        detail=True,
        methods=["POST"],
        url_path="test-path",
        url_name="test-path",
        serializer_class=MyCustomSerializer,
    )
    def test_path(self, request: Request, **kwargs) -> Response:
        
        print(self.get_serializer()) # Despite setting the 'MyCustomSerializer' it still gives me 'SecondSerializer'
       
        return Response(status=status.HTTP_200_OK)

如果我删除该get_serializer_class方法并只提供一个序列化程序,它就可以工作。

什么可能是最好的解决方案,或者这是否是 drf 中的任何错误?

理想情况下,额外操作应使用已提供但未提供的序列化程序类。

标签: pythondjangodjango-rest-frameworkdjango-views

解决方案


对此可能有更好的方法,但在我脑海中,您可以通过将您的更改get_serializer_class为:

    def get_serializer_class(self) -> Type[ModelSerializer]:
        if self.action == "list" or self.action == "get":
            return FirstSerializer
        return self.serializer_class or SecondSerializer

serializer_class如果操作既不是列表也不是获取,这将确保使用您的操作中定义的。


推荐阅读