****

由于博客园不支持markdown语法,所以推荐以下链接阅读:

原创 https://blog.csdn.net/weixin_42495873/article/details/89433542

# Django嵌套递归序列化器实现

**最近在做自己的项目,需要返回评论表相关数据,我的评论表设计的是这样的,父id为空则是等级最高的父评论,然后依次为子、孙子。。。评论信息关联,类似于省市级三级联动,不过这个评论表的深度可以更深**

![我的评论表](https://img-blog.csdnimg.cn/2019042114353698.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjQ5NTg3Mw==,size_16,color_FFFFFF,t_70)
### 1.刚开始采取的是序列化器嵌套
1.序列化器嵌套就简单多了,只不过就是层数比较多,然后后面都是重复的,下面是我刚开始的重复的序列化器嵌套
![自己的模型类](https://img-blog.csdnimg.cn/20190421144424984.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjQ5NTg3Mw==,size_16,color_FFFFFF,t_70)
2.优点是简单,但是缺点就是**评论深度不太高,而且代码也太冗余了**。
3.虽然简单完成了,就去完善前端代码了,前端写着写着,把评论显示的递归实现了(jquery),所以就想着在完善一下,看看能不能使用序列化递归的方式完成.
### 2.递归序列化器
- 在网上找资料,发现官方提供的有递归序列化器的方式。![官方递归序列化器](https://img-blog.csdnimg.cn/20190421145133406.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjQ5NTg3Mw==,size_16,color_FFFFFF,t_70)
- 官方链接在这里[这儿][1],不过可以看到,支持的Django1.8,1.9.2.0 ...,而我用Djnago1.11开发的,所以用不了。。。
- 又开始找资料了。。很高兴找到了类似的..l![递归序列化器](https://img-blog.csdnimg.cn/20190421145825240.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjQ5NTg3Mw==,size_16,color_FFFFFF,t_70)
- serializers.SerializerMethodField()这个方法好像是指定返回你需要返回的字段信息,不受前面的模型类名影响,更加方便、灵活配合,下面的函数使用.前面指定的字段名要在函数 **get_指定字段名**相同.
- 不过,他返回的父类,而我需要返回的是该外键的**反向引用**,这个父评论多个子评论,所以序列化器加入many=True,然后就ok了,只需要一个序列化器就够了
```python
class Childrens_Conten_Serializer(ModelSerializer):
user = User_Avatar_Url_Serializer()
subs = serializers.SerializerMethodField()

class Meta:
model = Comment
fields =('id','like','subs','content','user')

def get_subs(self, obj):
if obj.subs:
return Childrens_Conten_Serializer(obj.subs,many=True).data
else:
return None
```
- 递归序列化返回的数据,如果有多个层级依旧可以。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191203112335923.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjQ5NTg3Mw==,size_16,color_FFFFFF,t_70)
完美实现,前端代码就不展示了,感觉写的贼复杂,比较乱。。![前端页面](https://img-blog.csdnimg.cn/20190421151239305.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjQ5NTg3Mw==,size_16,color_FFFFFF,t_70)
- 第一次写博客,markdown用的不太好,是个技术小白,多分享自己遇到的bug和问题吧,还请各位大神指点指点。。。

[1]:https://github.com/heywbj/django-rest-framework-recursive

DjangoRestful 递归嵌套序列化器实现的更多相关文章

  1. 使用紧凑的序列化器,数倍提升性能 —— ESFramework 4.0 快速上手(11)

    在分布式通信系统中,网络传递的是二进制流,而内存中是我们基于对象模型构建的各种各样的对象,当我们需要将一个对象通过网络传递给另一个节点时,首先需要将其序列化为字节流,然后通过网络发送给目标节点,目标节 ...

  2. DRF中的序列化器

    DRF中的序列化器详细应用   视图的功能:说白了就是接收前端请求,进行数据处理 (这里的处理包括:如果前端是GET请求,则构造查询集,将结果返回,这个过程为序列化:如果前端是POST请求,假如要对数 ...

  3. 模型类序列化器ModelSerializer

    定义 比如我们创建一个BookInfoSerializer class BookInfoSerializer(serializers.ModelSerializer): ""&qu ...

  4. IOSerialize,xml和json,soap序列化器,二进制序列化器,XML序列化器,文件 检查、新增、复制、移动、删除

    1 文件夹/文件 检查.新增.复制.移动.删除,2 文件读写,记录文本日志/读取配置文件3 三种序列化器4 xml和json1.文件夹/文件 检查.新增.复制.移动.删除,2 文件读写,记录文本日志/ ...

  5. 16-DRF工程搭建与序列化器

    1.DRF工程搭建 环境安装与配置 DRF是以Django扩展应用的方式提供的,所以我们可以直接利用Django环境,而无需创建(先创建Django环境). 1.安装DRF pip3 install ...

  6. DRF框架之Serializer序列化器的序列化操作

    在DRF框架中,有两种序列化器,一种是Serializer,另一种是ModelSerializer. 今天,我们就先来学习一下Serializer序列化器. 使用Serializer序列化器的开发步骤 ...

  7. 序列化器:ModelSerializer

    ModelSerializer 类提供了一个快捷方式,可让你基于 Models 自动创建一个 Serializer 类,其中的字段与模型类字段对应. ModelSerializer 类与常规 Seri ...

  8. 在Wcf中应用ProtoBuf替代默认的序列化器

    Google的ProtoBuf序列化器性能的牛逼已经有目共睹了,可以把它应用到Socket通讯,队列,Wcf中,身为dotnet程序员一边期待着不久后Grpc对dotnet core的支持更期待着Wc ...

  9. NetworkComms V3 使用Json序列化器进行网络通信

    刚才在网上闲逛,偶然看到一篇文章 C#(服务器)与Java(客户端)通过Socket传递对象 网址是:http://www.cnblogs.com/iyangyuan/archive/2012/12/ ...

随机推荐

  1. UMD、CommonJS、ES Module、AMD、CMD模块的写法

    AMD异步模块规范 RequireJS就是AMD的一个典型的实现. 以下是一个只依赖与jQuery的模块代码: // foo.js define(['jquery'], function($){ // ...

  2. gitconfig别名配置

    vim ~/.gitconfig 进行配置 [user] name = Your Name email = you@yourdomain.example.com [core] editor = vim ...

  3. #C++初学记录(N皇后#回溯递归)

    <font size=5 face"微软雅黑">N皇后Problem Description <font size=4 face"微软雅黑"& ...

  4. 英语语法 - 介词on/in/at与时间

    介词滥用是中国学生的普遍缺点,主要是在语言学习的阶段没有人指正,形成有效的反馈,后面进入社会,就算别人发现你错了,也不会指正你,导致你一错再错. 看一篇教程,讲得不错.

  5. Navicat Premium连接MySQL 1251错误

    Navicat Premium连接MySQL 1251错误 MySQL Installer 8.0.17 ​ 出现上述错误的原因是版本MySQL 8.0.17即8.0开始的MySQL版本,因为采用新的 ...

  6. form表单文件上传提交且接口回调显示提交成功

    前端: <form method="post" enctype="multipart/form-data" id="formSubmit&quo ...

  7. mediacoder固定质量CRF

    视频编码:crf 与 bitrate 对照表 CRF(constant rate factor)就是x264/x265下压制视频的一种恒定量化值的编码方式,码率不恒定.其实就相当于vbr1pass.采 ...

  8. vue报错:There are multiple modules with names that only differ in casing.

    今天写项目时,遇到报错信息如下: 经过多次排除及参考网上文章,最后找到问题所在 排查原因:1 .在引用组件时,路径大小写不对也会造成此报错,看例子:错误写法: 正确写法: 2.在组件使用vuex时,引 ...

  9. 005 文档API

    1.索引API 下面的请求把JSON对象添加到school索引,_doc映射下. 关于POST请求,如果存在索引,则更新:如果不存在,则添加. POST school/_doc/1 { "n ...

  10. winform使用委托和事件在窗体之间传值

    定义委托和事件,并且触发这个事件 //定义委托 public delegate void ShowOutStockDelegate(List<OutStockResultDto> outS ...