如何为非数据库模型的ViewSet实现retrieve方法?
解决方案
你需要在MyDummyViewSet中实现retrieve方法,从你的mydummys字典里根据URL传入的id匹配对应的对象,具体代码修改如下:
from rest_framework.response import Response from rest_framework import status class MyDummyViewSet(viewsets.ViewSet): serializer_class = s.MyDummySerializer def list(self, request): serializer = s.MyDummySerializer( instance=m.mydummys.values(), many=True) return Response(serializer.data) def retrieve(self, request, pk=None): # 将URL中的pk转为整数(URL参数默认是字符串,和字典key类型匹配) try: dummy_id = int(pk) dummy_instance = m.mydummys.get(dummy_id) if not dummy_instance: return Response({"detail": "对象不存在"}, status=status.HTTP_404_NOT_FOUND) serializer = s.MyDummySerializer(instance=dummy_instance) return Response(serializer.data) except ValueError: return Response({"detail": "无效的ID格式"}, status=status.HTTP_400_BAD_REQUEST)
关键说明
- DRF的
ViewSet默认用pk作为详情接口的路径参数,对应你URL里的1这类数值 - 因为
mydummys字典的key是整数类型,所以要把URL传入的字符串类型pk转成整数 - 通过
get方法查找实例,找不到时返回标准的404错误,避免返回无意义的{"detail": null} - 增加了异常处理,防止传入非整数格式的ID导致报错
这样访问api/mydummy/1就能正确返回对应ID的对象数据了。
内容的提问来源于stack exchange,提问作者whitebear
相关产品推荐
相关产品推荐

