DRF使用无模型Serializer时DemoView报queryset缺失解决方法
报错原因
- 你使用的
viewsets.ModelViewSet是DRF专为对接数据库模型的增删改查场景设计的基类,内部强制要求配置queryset属性或重写get_queryset()方法获取模型数据源,你的场景不需要绑定数据模型,选择这个基类本身就不匹配。 - 代码存在两个隐藏问题:
- 序列化器文件名为
serializer.py,但视图层导入语句写的是from .serializers import DemoSerializer,文件名和导入路径不一致会触发导入错误。 - 视图中定义的
get()方法不符合视图集的方法命名规则,用DefaultRouter注册视图集时,/demo/路径的GET请求会自动映射到list()方法,你写的get()方法根本不会被路由匹配到。
- 序列化器文件名为
解决步骤
- 先修正文件名问题:将
myproject/myapp/serializer.py重命名为serializers.py,和视图中的导入路径保持一致。 - 替换视图基类,修改视图层
myproject/myapp/views.py代码如下:
from rest_framework import viewsets from rest_framework.response import Response from .serializers import DemoSerializer class DemoView(viewsets.ViewSet): def list(self, request): # 此处可传入任意不需要绑定模型的自定义数据 my_data = [{"name": "Harsha"}, {"name": "Harsha"}] results = DemoSerializer(my_data, many=True).data return Response(results)
- 路由层代码无需修改,重启服务后访问
http://localhost:8000/demo/即可正常返回序列化结果。
不推荐的替代方案:如果硬要沿用
ModelViewSet,可以通过给类添加空queryset属性、重写list方法绕过初始报错,但ModelViewSet自带的创建、详情查询、更新、删除方法全是针对数据库模型操作设计的,你不需要绑定模型的话这些冗余方法完全没用,还可能触发额外的逻辑错误,没有必要这么写。
内容的提问来源于stack exchange,提问作者Harsha Biyani
相关产品推荐
相关产品推荐

