Django2.0.2+Python3.4下如何实现指定格式的Serializer?PostView是否非ModelSerializer?
Django 2.0.x 嵌套序列化器实现指定输出格式
首先给你明确两个核心问题的答案,再一步步给你代码示例:
一、postview是否可以使用ModelSerializer?
其实不推荐,因为ModelSerializer的设计初衷是绑定到某个具体的数据库模型,而你的postview是组合post和reply的自定义结构,并没有对应的数据库表。硬要用ModelSerializer的话,你得指定一个无关的模型,完全没必要——用普通的serializers.Serializer会更灵活、更贴合场景。
二、如何实现你想要的输出格式?
首先先修正下你的序列化器命名(遵循Python的PEP8规范,类名首字母大写,避免和模型类名冲突),然后自定义一个组合序列化器来实现嵌套结构:
第一步:修正基础序列化器
假设你的模型类是Post和Reply(如果不是,替换成你实际的模型名即可),先把基础的ModelSerializer写规范:
# MySerializer.py from rest_framework import serializers from .models import Post, Reply # 导入你的模型类 class PostSerializer(serializers.ModelSerializer): class Meta: model = Post fields = ("postuid", "useruid", "content") class ReplySerializer(serializers.ModelSerializer): class Meta: model = Reply fields = ("replyuid", "postuid", "useruid", "content")
第二步:定义组合序列化器PostViewSerializer
这个序列化器用来组合Post和Reply的结构,因为reply是一个数组列表,所以需要给ReplySerializer加上many=True参数:
class PostViewSerializer(serializers.Serializer): post = PostSerializer() reply = ReplySerializer(many=True) # many=True表示接受一个对象列表,序列化后输出数组 class Meta: fields = ('post', 'reply')
第三步:在视图中构造数据并序列化
你需要先获取对应的post对象和reply列表,然后构造符合序列化器要求的数据结构,最后包装成你想要的外层postview结构:
# 假设在你的视图函数中 from .models import Post, Reply from .MySerializer import PostViewSerializer from rest_framework.response import Response def some_view(request): # 1. 获取目标post和对应的reply列表 target_post_uid = "xxx" # 替换成你实际的postuid post_obj = Post.objects.get(postuid=target_post_uid) reply_list = Reply.objects.filter(postuid=target_post_uid) # 2. 构造序列化需要的数据 serialize_data = { "post": post_obj, "reply": reply_list } # 3. 执行序列化 serializer = PostViewSerializer(data=serialize_data) if serializer.is_valid(): # 4. 包装成你想要的最终格式 final_output = {"postview": serializer.data} # 返回final_output给前端 return Response(final_output)
这样最终输出的格式就会完全符合你的需求:
{"postview":{"post":{"postuid":"xxx","useruid":"xxx","content":"xxx"},"reply":[{"replyuid":"xxx","postuid":"xxx","useruid":"xxx","content":"xxx"},...]}}
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

