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.
相关产品推荐
相关产品推荐

