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

如何在不传入data参数的情况下创建Django REST Serializer实例?

问题解决思路

你遇到的问题核心是:当不需要前端传入数据时,直接初始化LikeSerializer()却没传data参数,调用is_valid()必然报错——DRF序列化器在反序列化(创建/更新模型实例)时需要data参数做验证,空实例根本通不过验证。

针对你的场景,有两种简洁的解决方式:

方式一:直接创建模型实例,再序列化返回

既然post和liked_by都是后端直接获取的,完全不需要前端传数据,那就跳过序列化器的反序列化验证流程,直接创建Like对象,再用序列化器序列化后返回:

class AddLike(APIView):
    permission_classes = [IsAuthenticated]

    def post(self, request, pk):
        try:
            post = Post.objects.get(pk=pk)
        except Post.DoesNotExist:
            return Response({"detail": "帖子不存在"}, status=status.HTTP_404_NOT_FOUND)
        
        user = request.user
        # 先检查是否已点赞,避免重复创建
        if Like.objects.filter(post=post, liked_by=user).exists():
            return Response({"detail": "你已经点过赞了"}, status=status.HTTP_409_CONFLICT)
        
        # 直接创建Like实例
        like = Like.objects.create(post=post, liked_by=user)
        # 序列化后返回
        serializer = LikeSerializer(like)
        return Response(serializer.data, status=status.HTTP_201_CREATED)

方式二:调整序列化器,适配空data的验证

如果你一定要用序列化器的save()方法,需要修改LikeSerializer,把post和liked_by设为不需要前端传入(因为这两个字段由后端提供):

修改序列化器

class LikeSerializer(serializers.ModelSerializer):
    liked_by = UserSerializer(read_only=True)
    # 将post设为只读,或者标记为非必填
    post = serializers.PrimaryKeyRelatedField(read_only=True)

    class Meta:
        model = Like
        fields = ("id","post", "liked_by")

调整视图代码

class AddLike(APIView):
    permission_classes = [IsAuthenticated]

    def post(self, request, pk):
        try:
            post = Post.objects.get(pk=pk)
        except Post.DoesNotExist:
            return Response({"detail": "帖子不存在"}, status=status.HTTP_404_NOT_FOUND)
        
        user = request.user
        if Like.objects.filter(post=post, liked_by=user).exists():
            return Response({"detail": "你已经点过赞了"}, status=status.HTTP_409_CONFLICT)
        
        # 传入空data,此时序列化器只会验证允许的字段(这里post和liked_by都是只读,所以验证通过)
        serializer = LikeSerializer(data={})
        if serializer.is_valid():
            # 传入后端获取的post和user
            serializer.save(post=post, liked_by=user)
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

推荐方案

优先选方式一,它更直接,避免了不必要的序列化验证步骤,代码简洁高效。另外,加上Post.DoesNotExist的捕获和重复点赞的判断,能让接口更健壮。

内容的提问来源于stack exchange,提问作者Shaikh Ahmed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 03:33:30