DRF 在“list”和“get_object”上显示不同的字段 [重复]

Posted

技术标签:

【中文标题】DRF 在“list”和“get_object”上显示不同的字段 [重复]【英文标题】:DRF show different fields on 'list' and 'get_object' [duplicate] 【发布时间】:2019-04-17 12:10:37 【问题描述】:

我正在使用这样的视图集:

class UserViewSet(viewsets.ModelViewSet):
    """Viewset for model User."""

    queryset = User.objects.all()
    serializer_class = UserSerializer

我的序列化程序有以下字段:

fields = ('id', 'url', 'username', 'first_name', 'middle_name', 'last_name', 'role',
          'get_role_display', 'is_authenticated', 'is_staff', 'is_superuser', )

当我访问 api 以列出具有此 url /api/user/ 的所有用户时,它返回此 json_data:

[

    "id": 1,
    "url": "http://127.0.0.1:8000/api/user/1/",
    "username": "admin",
    "first_name": "",
    "middle_name": null,
    "last_name": "",
    "role": "A",
    "get_role_display": "Admin",
    "is_authenticated": true,
    "is_staff": true,
    "is_superuser": true
,

    "id": 2,
    "url": "http://127.0.0.1:8000/api/user/2/",
    "username": "7004104463",
    "first_name": "Vaibhav",
    "middle_name": "Bold",
    "last_name": "Vishal",
    "role": "S",
    "get_role_display": "Student",
    "is_authenticated": true,
    "is_staff": false,
    "is_superuser": false

]

但我想做的是只返回列表中的几个字段,只说'id', 'username', 'url',,但是在请求单个对象的请求中,像/api/user/1/ 我想返回所有字段。我想避免使用两个不同的 rest_framework 视图。我想要一个视图集和序列化器来实现这一点。有什么办法可以实现吗? 我在前端使用 React,我想避免获取不必要的数据。

【问题讨论】:

【参考方案1】:

我知道的唯一方法是覆盖 get_serializer_class-Method 并根据当前请求返回不同的 Serializer

class UserViewSet(viewsets.ModelViewSet):
    ....
    def get_serializer_class(self, request):
        if self.action == 'retrieve':
            return UserDetailSerializerClass
        return UserListSerializerClass

还有一个pypi package

致谢:https://***.com/a/22755648/7774036 & https://***.com/a/30670569/7774036

【讨论】:

谢谢,我明天用试试这个,同时我也会尝试找到一些方法让这个工作只用一个 seriailzer。 Serializers 的设计并不是按照你想要的方式工作,但我确信有办法破解它。它的代码总是有,但我不推荐它。了解如何使用 >1,也许使用 pypi 包更容易(我编写了自己的版本)。 我想出了一些不同的解决方案,例如根据视图的操作在序列化程序的 init 中弹出字段。这些使代码更短但更复杂。所以我认为使用不同的序列化程序类是你建议的最佳选择。

以上是关于DRF 在“list”和“get_object”上显示不同的字段 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

drf 中的ListAPIView视图

DRF中五大扩展类及视图集的介绍

DRF--路由组件和版本控制

Django get_object ,get_queryset方法

为啥我进入骑马与砍杀一半的时候就出现了:get_object failed for texture:然后就玩不了了!

DRF路由组件