作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
情况是这样的。我在我的 Django REST API 上得到了一个列表:/playerslist/
它返回了一个玩家列表,就像这个一样:
这正是我现在想要的。但是现在,我需要这个:
搜索 /playerslist/1/
给我 1 号球员的不同信息。该列表仅用于列出具有基本信息的球员。但我需要播放器的详细 View ,包含来自其他模型的信息和不同的序列化,这一定是一个基本问题,但由于我对 Django 和 Python 总体上是全新的,我一定误解了一些东西。
这是我的 View 集:
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
我怎样才能做到这一点?我必须使用 @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)
其中 PlayerDetailSerializer 是另一个具有不同字段(无论您需要什么)的序列化器,无需在 serializer_class 中指定它。
关于python - 如何让 'list' (players/) 和 'detail' (players/{id}) 有不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35322354/
我是一名优秀的程序员,十分优秀!