我已经设置了我的urls.pyViews.py文件,以两种不同的方式序列化我的项目模型:用于"检索"操作的详细信息和用于"列表"操作的简短信息.

到目前为止,这个方法运行得很好:

/projects/ = list of projects with abbreviated information
/projects/12 = detailed information about a specific project (id=12)

Urls.py:

router.register(r'projects', ProjectViewSet, basename='project')

Views.py

class ProjectViewSet(viewsets.ModelViewSet):

    serializer_class = ProjectSerializerMini

    # Select a serializer according to the action (i.e.: 'retrieve' will
    # return a more detailed serialized data than 'list')
    action_serializers = {
        'retrieve': ProjectSerializerDetail,
        'list': ProjectSerializerList
    }

    def get_serializer_class(self):

        return self.action_serializers.get(self.action, self.serializer_class)


我的问题是:是否有可能使用ViewSet框架调用第三个序列化程序,该序列化程序将返回even more detailed组信息.

例:/projects/12/extradetail

这样做的原因是,其中一些记录包括相当大量的地理空间数据.我只想在某些情况下检索这个额外的详细信息

推荐答案

您可以覆盖每个视图集中使用的序列化程序

class ProjectViewSet(viewsets.ModelViewSet):
    @action(detail=True, methods=['get'], serializer_class=SpecialSerializer)
    def special(self, request, pk=None):
        return super().retrieve(request, args, kwargs)
        

    def get_serializer_class(self):
        if self.action == 'list':
            return serializers.SimpleSerializer
        if self.action == 'retrieve':
            return serializers.DetailedSerializer
        return serializers.DefaultSerializer

与此相结合,您可以使用@actiondecorator 创建自定义动作

Django相关问答推荐

如何根据递归ManyToManyField值创建Django查询集?

""关系"core_Boundary_summary的列user_id中的空值"违反了非空约束|失败行包含(2,title,string,null)

社工/社工简戈

带有变量键的 Django 模板括号表示法不起作用

Templatetag 在 Django 4.2 模板 IF 条件中不起作用

在Django测试get方法中获取HttpResponseNotFound

Docker 中的 Django检测到更改...,正在重新加载错误

Django 注释(),计数()

如何将数据库中的 None 序列化为空对象?

Django - 使用在 URL 中传递的父类主键从子类中过滤对象

超级用户在基于类的视图中进行身份验证

如何根据查询集中的条件返回多个聚合?

Django过滤器查询外键

Django-Registration:邮箱作为用户名

模型中的外键

CherryPy 与 Django

从 virtualenv 中,pip freeze > requirements.txt 给出了一堆垃圾!如何修剪它?

Django - 每 x 秒运行一个函数

如何从 django 请求中获取完整的 url

何时使用 Django get_absolute_url() 方法?