Django中使用ForeignKey/ManyToManyField创建Post接口遇400错误排查
问题原因
你遇到的400错误是因为UserPostsSerializer里手动定义的user_id字段默认是必填项(required=True),但你在POST请求中没有传入这个字段,序列化器验证阶段就会报错——哪怕你在save()方法里传入了user_id=request.user.id,验证步骤是在save()之前执行的,所以会触发这个错误。和ManyToManyField的likes无关,这个字段是read_only=True,不会影响创建帖子的验证逻辑。
解决方案
有两种简单的修复方式:
方式一:移除手动定义的user_id字段(推荐)
ModelSerializer会自动处理ForeignKey字段的关联,你不需要手动添加user_id。直接利用视图中已有的request.user关联帖子即可:
修改后的序列化器:
class UserPostsSerializer(serializers.ModelSerializer): likes = UserSerializer(read_only=True, many=True) class Meta: model = UserPosts fields = ['id', 'user', 'text', 'likes', 'timestamp'] depth = 1
修改后的视图POST部分:
elif request.method == 'POST': serializer = UserPostsSerializer(data=request.data) if serializer.is_valid(raise_exception=True): serializer.save(user=request.user) return Response(serializer.data, status=status.HTTP_201_CREATED)
方式二:将user_id设为非必填
如果你坚持保留user_id字段,只需将它的required参数设为False,这样序列化器验证时就不会要求必须传入这个字段:
修改后的序列化器字段:
user_id = serializers.IntegerField(write_only=True, required=False)
视图POST部分可简化:
elif request.method == 'POST': serializer = UserPostsSerializer(data=request.data) if serializer.is_valid(raise_exception=True): serializer.save(user=request.user) return Response(serializer.data, status=status.HTTP_201_CREATED)
(注:user和user_id只需传一个即可,Django会自动处理关联关系)
内容的提问来源于stack exchange,提问作者Greg
相关产品推荐
相关产品推荐

