Django REST Framework DefaultRouter报错排查求助
解决Django REST Framework运行报错:TypeError: 'list' object is not callable
我来帮你一步步排查问题根源,先把两个关键问题拆解清楚:
1. 先确认views.py的修正(你已经做了,但再明确下)
你一开始在SubsystemViewSet里错误地把serializer_class赋值为SubsystemSerializer(queryset)——这是典型的用法错误,serializer_class只需要指定序列化器类本身,不需要传入实例。你后来改成serializer_class = SubsystemSerializer是完全正确的,这个问题已经解决了。
2. 核心报错原因:urls.py里的路由注册方式错误
你在urls.py里写了router.registry(r'subsystems', SubsystemViewSet),这里的registry是DefaultRouter的属性,它本质是一个用来存储已注册路由的列表,不是可调用的方法,所以把它当方法调用就会抛出'list' object is not callable的错误。
正确的做法是使用DRF路由提供的router.register()方法来注册视图集,这是标准用法。
修正后的完整代码
修正后的urls.py
from django.contrib import admin from django.urls import path, include from rest_framework.routers import DefaultRouter from subsystem.api.views import SubsystemViewSet, MenuViewSet # 按需添加Menu视图集 router = DefaultRouter() # 用register方法注册视图集,参数依次为路由前缀、视图集类 router.register(r'subsystems', SubsystemViewSet) router.register(r'menus', MenuViewSet) # 可选:如果需要暴露Menu的API就加上 urlpatterns = [ path('admin/', admin.site.urls), path('api/', include(router.urls)), # Django3.1+推荐用path代替旧的url方法 path('api-auth/', include('rest_framework.urls', namespace='rest_framework')) ]
确认后的views.py
from rest_framework.viewsets import ModelViewSet from subsystem.models import Subsystem, Menu from subsystem.api.serializers import SubsystemSerializer, MenuSerializer class SubsystemViewSet(ModelViewSet): queryset = Subsystem.objects.all() serializer_class = SubsystemSerializer # 正确写法:直接指定序列化器类 class MenuViewSet(ModelViewSet): queryset = Menu.objects.all() serializer_class = MenuSerializer
测试验证
修正后重新运行python manage.py runserver,访问http://localhost:8000/api/subsystems/,应该就能正常看到Subsystem的列表数据了。如果注册了Menu的视图集,访问http://localhost:8000/api/menus/也能正常获取数据。
内容的提问来源于stack exchange,提问作者yimeng lin
相关产品推荐
相关产品推荐

