Django应用Rest API报错求助:AttributeError与TypeError排查
问题1:DefaultRouter注册路由时的
AttributeError: 'function' object has no attribute 'get_extra_actions' 错误原因:router.register()需要接收ViewSet类作为参数,而不是as_view()返回的视图函数;同时你指定的action'users'不存在,你的ViewSet中定义的是list方法。
修正后的路由代码:
router = routers.DefaultRouter() # 直接传入ViewSet类,无需调用as_view() router.register('users', UserViewSet, basename='user') urlpatterns = [ path('admin/', admin.site.urls), path('api/', include(router.urls)), ]
问题2:直接路由配置后的
TypeError: __init__() takes 1 positional argument but 2 were given 错误根源在UserSerializer的定义上,大概率是以下两种情况:
- 序列化器没有继承Django REST Framework的基类(
serializers.Serializer或ModelSerializer) - 自定义了
__init__方法但未处理*args和**kwargs参数(many=True会传递额外参数给序列化器构造函数)
正确的序列化器示例
from rest_framework import serializers class UserSerializer(serializers.Serializer): id = serializers.IntegerField() name = serializers.CharField(max_length=100) phone = serializers.CharField(max_length=20) email = serializers.EmailField()
若自定义__init__方法需传递父类参数
class UserSerializer(serializers.Serializer): id = serializers.IntegerField() name = serializers.CharField(max_length=100) phone = serializers.CharField(max_length=20) email = serializers.EmailField() def __init__(self, *args, **kwargs): # 自定义逻辑写在这里 super().__init__(*args, **kwargs)
你的直接路由配置代码本身是正确的,确保序列化器修正后即可正常运行:
urlpatterns = [ path('admin/', admin.site.urls), path('api/users/', UserViewSet.as_view({'get': 'list'})), ]
内容的提问来源于stack exchange,提问作者Christian Termo
相关产品推荐
相关产品推荐

