restframework 序列化补充(自定义ModelSerializerl)
一、知识点
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)的更多相关文章
- rest-framework序列化
快速实例 Quickstart 序列化 开篇介绍: ---- 一切皆是资源,操作只是请求方式 ----book表增删改查 /books/ books /books/add/ addbook /book ...
- django基础之FBV与CBV,ajax序列化补充,Form表单
目录: FBV与CBV ajax序列化补充 Form表单(一) 一.FBV与CBV 1.什么是FBV.CBV? django书写view时,支持两种格式写法,FBV(function bases vi ...
- 基础命名空间:序列化_自定义序列化 System.Runtime.Serialization
( (From Msdn) 自定义序列化是控制类型的序列化和反序列化的过程,通过控制序列化,可以确保序列化兼容性.换而言之,在不中断类型核心功能的情况下,可在类型的不同版本之间序列化和反序列化. 重 ...
- django restframework serializer 增加自定义字段
在使用django restframework serializer 序列化在django中定义的model时,有时候我们需要额外在serializer中增加一些model中没有的字段.有两种方法实现 ...
- 从django的序列化到rest-framework 序列化
1.利用Django的view实现返回json数据 from django.views.generic import View from goods.models import Goods class ...
- day 94 RestFramework序列化组件与视图view
一 .复习 1. CBV流程 class BookView(View): def get(): pass def post(): pass #url(r'^books/', views.BookVie ...
- restframework序列化使用方法
serializers.Serializer class Userinfoserializers(serializers.Serializer): username = serializers.Cha ...
- Django restframework 序列化之 ModelSerializer 小记
首先介绍一下相关概念 序列化器(Serializer) 1. 自定义型: 继承rest_framework.serializers.Serializer 2. 模型类型: 继承rest_frame ...
- Android 进度条(ProgressBar)和拖动条(Seekbar)补充“自定义组件”(总结)
这周结束了,我也码了一周的字,感觉还是很有种脚踏实地的感觉的,有时间就可以看看自己的总结再查漏补缺,一步一个脚印,做出自己最理想的项目. 今天我们讲两点: 1.ProgressBar: 其实前面也稍微 ...
随机推荐
- liunx重定向控制台消息
Linux 在控制台记录策略上允许一些灵活性, 它允许你发送消息到一个指定的虚拟控制台 (如果你的控制台使用的是文本屏幕). 缺省地, 这个"控制台"是当前虚拟终端. 为了选择 一 ...
- linux /proc 接口和共享中断
在系统中安装共享处理者不影响 /proc/stat, 它甚至不知道处理者. 但是, /proc/interrupts 稍稍变化. 所有同一个中断号的安装的处理者出现在 /proc/interrupts ...
- 深度解读 - TDD(测试驱动开发)
转自:http://www.jianshu.com/p/62f16cd4fef3 本文结构: 什么是 TDD 为什么要 TDD 怎么 TDD FAQ 学习路径 延伸阅读 什么是 TDD TDD 有广义 ...
- js实现new
function New(fn,...args){ let obj={} obj.__proto__=fn.prototype let result=fn.apply(obj,args) if(typ ...
- Vue的数据双向绑定和Object.defineProperty()
Vue是前端三大框架之一,也被很多人指责抄袭,说他的两个核心功能,一个数据双向绑定,一个组件化分别抄袭angular的数据双向绑定和react的组件化思想,咱们今天就不谈这种大是大非,当然我也没到达那 ...
- SQL语句之子语句
子语句之间的顺序: WHERE GROUP ORDER LIMIT
- 为什么使用kotlin可以节省开发时间
前言:.kotlin是一门语言,光靠一篇文章要入门不太现实,所以这篇文章重点讲的是kotlin相对于java的一些特性和这些特性带来的好处. 一.简单介绍 Kotlin 是一种在 Java 虚拟机上运 ...
- vc++调用msscript.ocx解析实现C++与JavaScript脚本交互
ScriptControl接口 属性名称 类型 备注 AllowUI BOOL 检测是否允许运行用户的接口元素.如果为False,则诸如消息框之类的界面元素不可见. CodeObject Object ...
- $CH$3801 $Rainbow$的信号 期望+位运算
正解:位运算 解题报告: 传送门! 其实就是个位运算,,,只是顺便加了个期望的知识点$so$期望的帕并不难来着$QwQ$ 先把期望的皮扒了,就直接分类讨论下,不难发现,答案分为两个部分 $\left\ ...
- NB的程序员,亮瞎了你的眼吗?
郑重声明: 本文首发于人工博客 1.导读 你能想象到1K的代码能写出什么样的功能强大.效果炫酷的作品吗?来吧,今天小编带领大家认识下下面这位大神的作品. 西班牙程序员Roman Cortes用纯Jav ...