如何为“列表”(玩家/)和“详细信息”(玩家/{id})获得不同的结果?

Add*_*ict 5 python django django-queryset django-serializer django-rest-framework

这是情况。我的 Django REST API 上有一个列表:/playerslist/

它返回给我一个像这样的球员名单:

http://pastebin.com/JYA39gHT

这正是我目前想要的。但现在,我需要这个:

Going for/playerslist/1/为我提供了不同的玩家编号 1 信息。这里的列表仅用于列出具有基本信息的玩家。但是我需要玩家的详细视图,包含来自其他模型的信息并具有不同的序列化,这一定是一个基本问题,但由于我对 Django 和 Python 总体而言是全新的,我必须误解一些东西。

这是我的视图集:

class PlayersListViewSet(viewsets.ModelViewSet):
    queryset = Player.objects.all()
    serializer_class = PlayersListSerializer
    http_method_names = ['get', 'post']
    pagination_class = None
    filter_backends = [filters.OrderingFilter]
    ordering_fields = ['name']

   def get_queryset(self):
      queryset = Player.objects.all()
      team_id = self.request.query_params.get('team', None)

      if team_id:
          try:
              queryset = queryset.filter(team=team_id)
          except ValueError:
              raise exceptions.ParseError()
       return queryset
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?我必须使用@detail_route类似的东西playerslist/1/detail吗?我已经尝试过,但 DRF 的文档只显示了一个示例,对我来说根本不清楚。

Mat*_*tko 5

您可以覆盖方法retrieve(返回一个实例)或list(显然返回列表),如http://www.django-rest-framework.org/api-guide/viewsets/中的第一个示例所示。

class PlayersListViewSet(viewsets.ModelViewSet):
    queryset = Player.objects.all()
    serializer_class = PlayersListSerializer
    http_method_names = ['get', 'post']
    pagination_class = None
    filter_backends = [filters.OrderingFilter]
    ordering_fields = ['name']

   def get_queryset(self):
      queryset = Player.objects.all()
      team_id = self.request.query_params.get('team', None)

      if team_id:
          try:
              queryset = queryset.filter(team=team_id)
          except ValueError:
              raise exceptions.ParseError()
       return queryset

   def retrieve(self, request, *args, **kwargs):
       instance = self.get_object()
       serializer = PlayerDetailSerializer(instance)
       return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)

PlayerDetailSerializer 是另一个具有不同字段的序列化器(无论您需要什么),并且无需在 serializer_class 中指定它。