Add*_*ict 5 python django django-queryset django-serializer django-rest-framework
这是情况。我的 Django REST API 上有一个列表:/playerslist/
它返回给我一个像这样的球员名单:
这正是我目前想要的。但现在,我需要这个:
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 的文档只显示了一个示例,对我来说根本不清楚。
您可以覆盖方法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 中指定它。