DRF 在“list”和“get_object”上显示不同的字段

Vai*_*hal 4 python django python-3.x django-rest-framework

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

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

    queryset = User.objects.all()
    serializer_class = UserSerializer
Run Code Online (Sandbox Code Playgroud)

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

fields = ('id', 'url', 'username', 'first_name', 'middle_name', 'last_name', 'role',
          'get_role_display', 'is_authenticated', 'is_staff', 'is_superuser', )
Run Code Online (Sandbox Code Playgroud)

当我访问 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
}
]
Run Code Online (Sandbox Code Playgroud)

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

esc*_*ped 9

我知道的唯一方法是覆盖 -Methodget_serializer_classSerializer根据当前请求返回不同的方法。

class UserViewSet(viewsets.ModelViewSet):
    ....
    def get_serializer_class(self):
        if self.action == 'retrieve':
            return UserDetailSerializerClass
        return UserListSerializerClass
Run Code Online (Sandbox Code Playgroud)

还有一个pypi包

学分:/sf/answers/1592895391//sf/answers/2146939861/