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: 其实前面也稍微 ...
随机推荐
- Junit 测试集(打包测试)实例
测试集,直译过来的意思就是把测试集合起来,再详细一些就是把多个单元测试集合起来 .单元测试可以理解为:单个接口 或者单个类/方法 的测试 项目背景:测试基于spring开发的项目代码 实例模板:pac ...
- js中的函数重载
函数重载与js 什么是函数重载 重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数.类型或者顺序)必须不同,也就是说用 ...
- mysql常用基础语句学习
常用sql语句 查询: SELECT 列名(或者*,表示所有列) FROM 表名 WHERE 筛选条件; FROM 表名:顾名思义,就是从表名指定的这张表格中: WHERE 筛选条件:意思是" ...
- CF1169(div2)题解报告
CF1169(div2)题解报告 A 不管 B 首先可以证明,如果存在解 其中必定有一个数的出现次数大于等于\(\frac{m}{2}\) 暴力枚举所有出现次数大于等于$\frac{m}{2} $的数 ...
- jq 技巧汇总
1,jQuery方法$()实际上是拥有两个参数的 $('li','.firstEl').onclick(function(){.......}) 这里,第二个参数用来限制第一个参数给定的查找结果 ...
- POJ 3111 K Best 最大化平均值 [二分]
1.题意:给一共N个物品,每个物品有重量W,价值V,要你选出K个出来,使得他们的平均单位重量的价值最高 2.分析:题意为最大化平均值问题,由于每个物品的重量不同所以无法直接按单位价值贪心,但是目标值有 ...
- VRChat模型制作及上传总篇(201912)
1.视频资源及软件插件模型资源: Kodoku-shi :https://www.bilibili.com/video/av20097333(自己目前找到讲的最详细的教程,但是blender减免部分貌 ...
- 初识 Kafka Producer 生产者
目录 1.KafkaProducer 概述 2.KafkaProducer 类图 3.KafkaProducer 简单示例 温馨提示:整个 Kafka Client 专栏基于 kafka-2.3.0 ...
- 使用spring框架创建最简单的java web程序(IDEA商业版)
项目目录如下(IDEA社区版好像无法识别webapp目录?原因见https://www.cnblogs.com/bityinjd/p/9284378.html): 工具: IDEA 1.首先使用ma ...
- 20191031-7 beta week 1/2 Scrum立会报告+燃尽图 05
此作业的要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/9915 git地址:https://e.coding.net/Eusti ...