You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 00:40:15