DRF模型序列化器返回含None值字典问题求助
问题原因
你用Like.objects.filter(...)得到的是QuerySet对象(即使只有一条匹配数据),而默认的LikeSerializer是用来序列化单个模型实例的,直接传入QuerySet会导致序列化器无法正确识别对象结构,所以返回字段为None。
解决办法
有两种可行的修复方案:
方案1:使用get()获取单个实例(推荐)
因为你的Like模型设置了unique_together = ("post_liked", "like_author"),同一用户对同一帖子最多只有一条点赞记录,直接用get()获取单个实例即可:
class LikeDetail(View): def get(self, request, *args, **kwargs): if request.headers.get('X-Requested-With') == 'XMLHttpRequest': user = request.user post = Post.objects.get(id=kwargs["post_id"]) try: like = Like.objects.get(post_liked=post, like_author=user) obj = LikeSerializer(like).data except Like.DoesNotExist: # 处理用户未点赞的情况,返回空数据或自定义提示 obj = {} print(obj) return JsonResponse(obj) return
注:直接传post和user对象即可,无需传pk,Django会自动处理外键匹配逻辑。
方案2:序列化时添加many=True参数
如果需要保留filter()(比如避免get()抛出的DoesNotExist异常),可以在序列化时指定many=True,告诉序列化器要处理一个QuerySet集合:
class LikeDetail(View): def get(self, request, *args, **kwargs): if request.headers.get('X-Requested-With') == 'XMLHttpRequest': user = request.user post = Post.objects.get(id=kwargs["post_id"]) like = Like.objects.filter(post_liked=post, like_author=user) obj = LikeSerializer(like, many=True).data print(obj) # 返回列表格式数据时,需给JsonResponse加safe=False参数 return JsonResponse(obj, safe=False) return
内容的提问来源于stack exchange,提问作者vadim
相关产品推荐
相关产品推荐

