在Django REST Framework中结合ViewSet与Generics报错求助
问题解决步骤
1. 修正urls.py中的导入和路由配置
你出现ImportError的核心原因是旧的urls.py仍然在引用已删除的SnippetList和SnippetDetail类。需要完全替换为DefaultRouter的配置:
from django.urls import path, include from rest_framework.routers import DefaultRouter from snippets.views import SnippetViewSet # 初始化路由器 router = DefaultRouter() # 注册Snippet视图集,自动生成标准路由 router.register(r'snippets', SnippetViewSet) urlpatterns = [ path('', include(router.urls)), ]
DefaultRouter会自动为你生成:
/snippets/:支持GET(列表)、POST(新建)请求/snippets/<int:pk>/:支持GET(详情)、PUT(更新)、DELETE(删除)请求
2. 修正SnippetViewSet的继承方式
你当前的继承写法(同时继承viewsets.GenericViewSet和generics.ListCreateAPIView等)存在类继承冲突,因为generics下的视图类已经是完整的视图实现,和GenericViewSet的继承逻辑重复。推荐两种更规范的写法:
方式一:直接使用ModelViewSet(最简洁)
ModelViewSet已经封装了所有你需要的列表、创建、详情、更新、删除功能:
from rest_framework import viewsets from .models import Snippet from .serializers import SnippetSerializer class SnippetViewSet(viewsets.ModelViewSet): queryset = Snippet.objects.all() serializer_class = SnippetSerializer
方式二:手动组合Mixin和GenericViewSet(更灵活)
如果需要自定义部分逻辑,可以用Mixin类组合:
from rest_framework import viewsets, mixins from .models import Snippet from .serializers import SnippetSerializer class SnippetViewSet( mixins.ListModelMixin, mixins.CreateModelMixin, mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, viewsets.GenericViewSet ): queryset = Snippet.objects.all() serializer_class = SnippetSerializer
3. 验证功能
启动服务后:
- 访问
/snippets/:可以查看所有数据,提交POST请求新建snippet - 访问
/snippets/<id>/:可以查看详情,提交PUT请求更新,提交DELETE请求删除
内容的提问来源于stack exchange,提问作者Mosleh Uddin Asad
相关产品推荐
相关产品推荐

