一、知识点

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. liunx重定向控制台消息

    Linux 在控制台记录策略上允许一些灵活性, 它允许你发送消息到一个指定的虚拟控制台 (如果你的控制台使用的是文本屏幕). 缺省地, 这个"控制台"是当前虚拟终端. 为了选择 一 ...

  2. linux /proc 接口和共享中断

    在系统中安装共享处理者不影响 /proc/stat, 它甚至不知道处理者. 但是, /proc/interrupts 稍稍变化. 所有同一个中断号的安装的处理者出现在 /proc/interrupts ...

  3. 深度解读 - TDD(测试驱动开发)

    转自:http://www.jianshu.com/p/62f16cd4fef3 本文结构: 什么是 TDD 为什么要 TDD 怎么 TDD FAQ 学习路径 延伸阅读 什么是 TDD TDD 有广义 ...

  4. js实现new

    function New(fn,...args){ let obj={} obj.__proto__=fn.prototype let result=fn.apply(obj,args) if(typ ...

  5. Vue的数据双向绑定和Object.defineProperty()

    Vue是前端三大框架之一,也被很多人指责抄袭,说他的两个核心功能,一个数据双向绑定,一个组件化分别抄袭angular的数据双向绑定和react的组件化思想,咱们今天就不谈这种大是大非,当然我也没到达那 ...

  6. SQL语句之子语句

    子语句之间的顺序: WHERE  GROUP  ORDER LIMIT

  7. 为什么使用kotlin可以节省开发时间

    前言:.kotlin是一门语言,光靠一篇文章要入门不太现实,所以这篇文章重点讲的是kotlin相对于java的一些特性和这些特性带来的好处. 一.简单介绍 Kotlin 是一种在 Java 虚拟机上运 ...

  8. vc++调用msscript.ocx解析实现C++与JavaScript脚本交互

    ScriptControl接口 属性名称 类型 备注 AllowUI BOOL 检测是否允许运行用户的接口元素.如果为False,则诸如消息框之类的界面元素不可见. CodeObject Object ...

  9. $CH$3801 $Rainbow$的信号 期望+位运算

    正解:位运算 解题报告: 传送门! 其实就是个位运算,,,只是顺便加了个期望的知识点$so$期望的帕并不难来着$QwQ$ 先把期望的皮扒了,就直接分类讨论下,不难发现,答案分为两个部分 $\left\ ...

  10. NB的程序员,亮瞎了你的眼吗?

    郑重声明: 本文首发于人工博客 1.导读 你能想象到1K的代码能写出什么样的功能强大.效果炫酷的作品吗?来吧,今天小编带领大家认识下下面这位大神的作品. 西班牙程序员Roman Cortes用纯Jav ...