python - 设置条件序列化程序类删除自定义序列化程序类以在 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 中的任何错误?
理想情况下,额外操作应使用已提供但未提供的序列化程序类。
解决方案
对此可能有更好的方法,但在我脑海中,您可以通过将您的更改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
如果操作既不是列表也不是获取,这将确保使用您的操作中定义的。
推荐阅读
- php - 如何按降序动态排序年份范围数组
- android-studio - 更新到新的 android studio artic fox (2020.3.1) 后出现主题问题
- symfony - 使用 botman 发送电子邮件
- javascript - 将大型 XML 文件读入 Javascript 的问题
- java - 如何从 CSV 等数据集中“垂直”读取
- jquery - 如何仅在短时间内更改按钮的值
- php - 在 Laravel 中选择具有条件的特定列
- android - 字符串反转程序,Kotlin
- azure - 如何使用 rest 命令或 shell 脚本或使用此 repo“api-management-developer-portal”发布 apim 开发人员门户
- java - 在 mongodb 中插入一个 Map 类型的变量,其中 Enum 作为键