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

Django Rest API用户注册接口报错:POST方法不允许及多对多赋值错误

问题解决指南

错误1:Method "POST" not allowed

原因

@action(detail=True) 会生成带用户ID的路由(/users/<pk>/register),但注册是创建新用户的集合级操作,不需要指定现有用户ID,因此POST请求到该路径会被拒绝。

修复方案

将detail=True改为detail=False,生成集合级路由(/users/register),同时修正代码中的语法错误和错误状态码:

@action(detail=False, methods=["post"])
def register(self, request):
    serializer = UserSerializers(data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

注:原代码中return Response缺少右括号,且参数错误应返回HTTP_400_BAD_REQUEST而非HTTP_404_NOT_FOUND。


错误2:TypeError: Direct assignment to the forward side of a many-to-many set is prohibited

原因

Django内置User模型包含groups和user_permissions两个多对多字段,序列化器使用fields="__all__"会将其纳入。调用create_user(**validated_data)时,若请求数据包含这两个字段,create_user无法直接处理多对多赋值,导致报错。

修复方案

方案1:排除不必要的多对多字段

明确指定序列化字段,排除groups和user_permissions:

class UserSerializers(ModelSerializer):
    class Meta:
        model = User
        fields = ["username", "password", "email", "first_name", "last_name"]  # 按需添加字段
        extra_kwargs = {"password": {"write_only": True}}

    def create(self, validated_data):
        user = User.objects.create_user(**validated_data)
        Token.objects.create(user=user)
        return user

方案2:手动处理多对多关系

若需支持用户组/权限设置,先从validated_data中取出多对多数据,创建用户后再绑定关系:

class UserSerializers(ModelSerializer):
    class Meta:
        model = User
        fields = "__all__"
        extra_kwargs = {"password": {"write_only": True}}

    def create(self, validated_data):
        # 提取多对多字段数据
        groups_data = validated_data.pop('groups', [])
        permissions_data = validated_data.pop('user_permissions', [])
        
        user = User.objects.create_user(**validated_data)
        
        # 绑定多对多关系
        user.groups.set(groups_data)
        user.user_permissions.set(permissions_data)
        
        Token.objects.create(user=user)
        return user

额外建议

注册功能可直接复用ModelViewSet自带的create方法,无需额外编写register action,只需确保序列化器的create方法正确处理密码加密和Token生成即可。

内容的提问来源于stack exchange,提问作者Oula R.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 18:19:55