调用Django ModelViewSet端点时出现Method Not Allowed错误排查
1. 视图类方法缩进错误(核心问题之一)
你的perform_create方法缩进错误,定义在了SubmissionViewSet类的外部,导致DRF无法调用该方法自动填充student字段,既会造成创建Submission时缺少必填关联,也可能干扰视图的方法映射逻辑。
修复代码:
class SubmissionViewSet(viewsets.ModelViewSet): serializer_class = SubmissionSerializer queryset = Submission.objects.all().order_by("-created_at") permission_classes = [IsAuthenticated] # 将方法缩进至类内部 def perform_create(self, serializer): serializer.save(student=self.request.user)
2. 序列化器project字段处理不当
你在SubmissionSerializer中使用serializers.UUIDField()接收项目UUID,但该字段默认不会自动将UUID转换为对应的Project实例,导致创建时无法正确关联项目。
修复方案:
将project字段改为PrimaryKeyRelatedField并指定查询集,DRF会自动验证并转换UUID为Project实例:
class SubmissionSerializer(serializers.ModelSerializer): # 替换UUIDField为PrimaryKeyRelatedField project = serializers.PrimaryKeyRelatedField(queryset=Project.objects.all()) course = serializers.SerializerMethodField() date_submitted = serializers.SerializerMethodField() # 其余代码保持不变
如果你的Project模型主键是UUID,该修改完全适用;若主键为其他类型,确保传入对应主键值即可。
3. 路由冲突检查
检查URL配置中,是否在include(router.urls)之前存在其他匹配/api/v1/auth/users/student/submission/的URL模式。例如提前定义的仅允许GET方法的函数视图,会导致POST请求被错误匹配,返回405错误。
确保include(router.urls)的位置在所有具体URL路径之后,或调整路由顺序避免冲突。
4. Trailing Slash配置检查
Django默认启用APPEND_SLASH=True,若请求URL未以/结尾,会被重定向到带/的版本;若客户端未跟随重定向,可能出现405错误。
确保请求URL以/结尾(即/api/v1/auth/users/student/submission/),或在settings.py中确认APPEND_SLASH配置。
内容的提问来源于stack exchange,提问作者Abbracx

