一、知识点

1、source

title = serializers.CharField(source='courses.title')

source用于one2one、foreginkey、choices,用与获取一个结果

2、SerializerMethodField

    title = serializers.CharField(source='courses.title')
recommend_courses = serializers.SerializerMethodField()
chapter = serializers.SerializerMethodField() def get_recommend_courses(self, obj):
rc_list = obj.recommend_courses.all()
return [{'id': rc_obj.id, 'title': rc_obj.title} for rc_obj in rc_list] def get_chapter(self, obj):
query_set = obj.courses.chapter_set.all()
print("=============>", query_set) # <QuerySet [<Chapter: 基础语法>, <Chapter: 函数>, <Chapter: 面向对象>]>
return [{'id': obj.id, 'name': obj.name} for obj in query_set] class Meta:
model = CourseDetail
fields = ['id', 'slogan', 'why', 'title', 'recommend_courses', 'chapter']

SerializerMethodField用于many2many 和 获取的结果是多个值(queryset) 外键的反向查询

3、depth(一般不用)

depth 按照表的关系

当数据量较大时,给前端开发人员取数据造成了不便

depth值 0-10

class CourseDetailSerializer(serializers.ModelSerializer):
"""
课程细节序列化
"""
class Meta:
model = CourseDetail
# fields = ['id', 'slogan', 'why', 'title', 'recommend_courses', 'chapter'] fields = '__all__'
depth = 0

a、depth为0

b、depth为1

二、例子:

models.py

from django.db import models

# Create your models here.

class Course(models.Model):
"""
课程表
"""
title = models.CharField(verbose_name="课程名称", max_length=32)
course_img = models.CharField(verbose_name="课程图片", max_length=128)
level_choices = (
(1, '初级'),
(2, '中级'),
(3, '高级')
)
level = models.IntegerField(verbose_name="课程等级", choices=level_choices) def __str__(self):
return self.title class CourseDetail(models.Model):
"""
课程细节表
"""
courses = models.OneToOneField(verbose_name="课程表", to="Course", on_delete=models.CASCADE)
slogan = models.CharField(verbose_name="标语", max_length=255)
why = models.CharField(verbose_name="为什么要学?", max_length=255)
recommend_courses = models.ManyToManyField(verbose_name="推荐课程", to="Course", related_name="rc") def __str__(self):
return self.courses.title class Chapter(models.Model):
"""
课程章节表
"""
num = models.IntegerField(verbose_name="章节")
name = models.CharField(verbose_name="章节名称", max_length=32)
courses = models.ForeignKey(verbose_name="所属课程", to="Course", on_delete=models.CASCADE) def __str__(self):
return self.name

序列化

from api.models import Chapter, Course, CourseDetail
from rest_framework import serializers # class CourseSerializer(serializers.ModelSerializer):
"""
课程表序列化
"""
level = serializers.CharField(source="get_level_display") class Meta:
model = Course
fields = ['id', 'title', 'course_img', 'level'] class CourseDetailSerializer(serializers.ModelSerializer):
"""
课程细节序列化
"""
title = serializers.CharField(source='courses.title')
recommend_courses = serializers.SerializerMethodField()
chapter = serializers.SerializerMethodField() def get_recommend_courses(self, obj):
rc_list = obj.recommend_courses.all()
return [{'id': rc_obj.id, 'title': rc_obj.title} for rc_obj in rc_list] def get_chapter(self, obj):
query_set = obj.courses.chapter_set.all()
print("=============>", query_set) # <QuerySet [<Chapter: 基础语法>, <Chapter: 函数>, <Chapter: 面向对象>]>
return [{'id': obj.id, 'name': obj.name} for obj in query_set] class Meta:
model = CourseDetail
fields = ['id', 'slogan', 'why', 'title', 'recommend_courses', 'chapter'] class ChapterSerializer(serializers.ModelSerializer):
"""
课程章节序列化
"""
class Meta:
model = Chapter
fields = '__all__'

restframework 序列化补充(自定义ModelSerializerl)的更多相关文章

  1. rest-framework序列化

    快速实例 Quickstart 序列化 开篇介绍: ---- 一切皆是资源,操作只是请求方式 ----book表增删改查 /books/ books /books/add/ addbook /book ...

  2. django基础之FBV与CBV,ajax序列化补充,Form表单

    目录: FBV与CBV ajax序列化补充 Form表单(一) 一.FBV与CBV 1.什么是FBV.CBV? django书写view时,支持两种格式写法,FBV(function bases vi ...

  3. 基础命名空间:序列化_自定义序列化 System.Runtime.Serialization

    (  (From Msdn) 自定义序列化是控制类型的序列化和反序列化的过程,通过控制序列化,可以确保序列化兼容性.换而言之,在不中断类型核心功能的情况下,可在类型的不同版本之间序列化和反序列化. 重 ...

  4. django restframework serializer 增加自定义字段

    在使用django restframework serializer 序列化在django中定义的model时,有时候我们需要额外在serializer中增加一些model中没有的字段.有两种方法实现 ...

  5. 从django的序列化到rest-framework 序列化

    1.利用Django的view实现返回json数据 from django.views.generic import View from goods.models import Goods class ...

  6. day 94 RestFramework序列化组件与视图view

    一 .复习 1. CBV流程 class BookView(View): def get(): pass def post(): pass #url(r'^books/', views.BookVie ...

  7. restframework序列化使用方法

    serializers.Serializer class Userinfoserializers(serializers.Serializer): username = serializers.Cha ...

  8. Django restframework 序列化之 ModelSerializer 小记

    首先介绍一下相关概念 序列化器(Serializer) 1. 自定义型:  继承rest_framework.serializers.Serializer 2. 模型类型:  继承rest_frame ...

  9. Android 进度条(ProgressBar)和拖动条(Seekbar)补充“自定义组件”(总结)

    这周结束了,我也码了一周的字,感觉还是很有种脚踏实地的感觉的,有时间就可以看看自己的总结再查漏补缺,一步一个脚印,做出自己最理想的项目. 今天我们讲两点: 1.ProgressBar: 其实前面也稍微 ...

随机推荐

  1. P1090 后缀表达式

    题目描述 所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级). 如:3(5–2)+7对应的 ...

  2. MSBuild 常用参数

    本文告诉大家在 MSBuild 里面常用的参数 一般的 msbuild 在编译的时候都会添加很多参数,用法如下 进入对应编译的 sln 或 csproj 文件所在的文件夹,执行下面命名 msbuild ...

  3. linux poll 和 select

    使用非阻塞 I/O 的应用程序常常使用 poll, select, 和 epoll 系统调用. poll, select 和 epoll 本质上有相同的功能: 每个允许一个进程来决定它是否可读或者写一 ...

  4. 51nod 1832 前序后序遍历

    思路:设只有一颗子树的节点有ans个设前序边历数组为pre[100],后序遍历数组为pos[100]:前序遍历的第二个元素是A的一个子节点左右节点不知,设ax-ay表示一个树的前序遍历,bx-by表示 ...

  5. Linux 内核总线

    一个总线是处理器和一个或多个设备之间的通道. 为设备模型的目的, 所有的设备都通过 一个总线连接, 甚至当它是一个内部的虚拟的,"平台"总线. 总线可以插入另一个 - 一个 USB ...

  6. 利用脚本运行APP

    1.电脑安装Xcode(iOS)/Androidsdk(Android),连接手机,并在手机上安装相应代理,下图为iOS的Xcode代理样式: 2.打开Appium,点击搜索图标,添加并设置该手机信息 ...

  7. 第二阶段:2.商业需求分析及BRD:3.产品需求分析

    产品需求收集之后就可以进行产品需求分析了. 比如微信功能的逐步完善,偏向于做加法,但有时候也会做减法. Y轴是重要跟不重要 X轴是紧急跟不紧急 然后通过各个需求的分数来确定坐标位置.同时可以根据阶段调 ...

  8. 【题解】CF741D(DSU on TREE)

    [题解]CF741D(DSU on TREE) 写一写这道题来学习学习模板 用二进制来转换一下条件,现在就是要求一下\(lowbit(x)=x\)的那些路径了. DSU on TREE 是这样一种算法 ...

  9. kettle高级教程-自动同步

    KETTLE4个工作中有用的复杂实例--2.两表数据比较,比较后自动同步(部门.单位数据同步) 二.两表数据比较核对,核对后自动同步至目标数据表 目标:比较t_bm表的数据和t_bm_target表的 ...

  10. java序列化(一)

    今天我们来探讨一下java的序列化与反序列化.之前对此一直有概念,但是并没有真正的去测试.大家都知道,所谓的序列化就是把java代码读取到一个文件中,反序列化就是从文件中读取出对象.在网络传输过程中, ...