DRF教程1-序列化
Serializers
Serializers 可以将queryset 和 model instance 转为为navite python datetype,然后render为JSON,给到api。也可以反序列化,把数据解析,验证数据,然后给到db。
django中的Serializer class,可以控制响应的输出方式。
序列化类
要建立web API,要做的第一件事就是对实例进行序列化,比如以json方式显示。我们可以生命序列化,它和django的forms很相似。在app目录下创建serializers.py
from rest_framework import serializers from .models import Course class CourseSerializer(serializers.Serializer):
"""
Course序列化
"""
id = serializers.IntegerField(read_only=True)
name = serializers.CharField(required=True,max_length=64)
desc = serializers.CharField(required=True,max_length=512)
detail = serializers.CharField(required=True)
learn_times = serializers.IntegerField(required=True)
degree = serializers.ChoiceField(choices=(('hard','较难'),('middle','中级'),('easy','简单')), required=True)
students = serializers.IntegerField(required=True)
fav_num = serializers.IntegerField(required=True)
click_num = serializers.IntegerField(required=True)
catalog = serializers.CharField(required=True,max_length=32)
# image = serializers.ImageField(required=True,max_length=64)
# add_time = serializers.DateTimeField(required=True) def create(self, validated_data):
"""
Create and return a new `Course` instance, given the validated data.
"""
return Course.objects.create(**validated_data) def update(self, instance, validated_data):
"""
Update and return an existing `Course` instance, given the validated data.
"""
instance.name = validated_data.get('name', instance.name)
instance.desc = validated_data.get('desc', instance.desc)
instance.detail = validated_data.get('detail', instance.detail)
instance.learn_times = validated_data.get('learn_times', instance.learn_times)
instance.degree = validated_data.get('degree', instance.degree)
instance.students = validated_data.get('students', instance.students)
instance.fav_num = validated_data.get('fav_num', instance.fav_num)
instance.click_num = validated_data.get('click_num', instance.click_num)
instance.catalog = validated_data.get('catalog', instance.catalog)
instance.save()
return instance
#序列化类的第一部分,定义了序列化/反序列化的字段。creata和update方法定义了调用serializer.save()时如何创建或者修改实例
#
使用序列化
from courses.models import Course
from courses.serializer import CourseSerializer
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser course = Course(name = "win桌面运维2",desc = "win桌面运维2", detail = "jabbok授课", learn_times = 120,degree = "middle", students = 1,fav_num = 0,click_num = 0,catalog = "运维")
course.save()
#使用Course类创建一个course实例,然后保存(调用序列化类中的create方法)
#这时这个字段已经在数据库中被创建,id字段自动出现 serializer = CourseSerializer(course)
serializer.data
{'id': 4, 'name': 'win桌面运维2', 'desc': 'win桌面运维2', 'detail': 'jabbok授课', 'learn_times': 120, 'degree': 'middle', 'students': 1, 'fav_num': 0, 'click_num': 0, 'catalog': '运维'}
#使用自定义的CourseSerializer序列化类,对course实例创建序列化实例serializer
#data属性显示序列化实例的数据 content = JSONRenderer().render(serializer.data)
content
b'{"id":4,"name":"win\xe6\xa1\x8c\xe9\x9d\xa2\xe8\xbf\x90\xe7\xbb\xb42","desc":"win\xe6\xa1\x8c\xe9\x9d\xa2\xe8\xbf\x90\xe7\xbb\xb42","detail":"jabbok\xe6\x8e\x88\xe8\xaf\xbe","learn_times":120,"degree":"middle","students":1,"fav_num":0,"click_num":0,"catalog":"\xe8\xbf\x90\xe7\xbb\xb4"}'
#在这时的数据还是python数据格式,最后一步把数据render为json数据。 import io stream = io.BytesIO(content)
data = JSONParser().parse(stream) serializer = CourseSerializer(data=data)
serializer.is_valid()
>>>True
serializer.validated_data
OrderedDict([('name', 'win桌面运维2'), ('desc', 'win桌面运维2'), ('detail', 'jabbok授课'), ('learn_times', 120), ('degree', 'middle'), ('students', 1), ('fav_num', 0), ('click_num', 0), ('catalog', '运维')])
serializer.save()
<Course: win桌面运维2>
#反序列化是相似的。先把一个steam解析为python数据格式
#然后把这个数据填充为一个实例对象。 serializer = CourseSerializer(Course.objects.all(), many=True)
serializer.data
[OrderedDict([('id', 1), ('name', 'django入门'), ('desc', 'dj入门'), ('detail', 'jabbok的课程'), ('learn_times', 120), ('degree', 'easy'), ('students', 12), ('fav_num', 0), ('click_num', 0), ('catalog', '运维')]), OrderedDict([('id', 2), ('name', '精通python'), ('desc', '精通python的课程'), ('detail', 'jabbok授课'), ('learn_times', 230), ('degree', 'easy'), ('students', 12), ('fav_num', 0), ('click_num', 0), ('catalog', '运维')]), OrderedDict([('id', 3), ('name', 'win桌面运维'), ('desc', 'win桌面运维'), ('detail', 'jabbok授课'), ('learn_times', 120), ('degree', 'middle'), ('students', 1), ('fav_num', 0), ('click_num', 0), ('catalog', '运维')]), OrderedDict([('id', 4), ('name', 'win桌面运维2'), ('desc', 'win桌面运维2'), ('detail', 'jabbok授课'), ('learn_times', 120), ('degree', 'middle'), ('students', 1), ('fav_num', 0), ('click_num', 0), ('catalog', '运维')]), OrderedDict([('id', 5), ('name', 'win桌面运维2'), ('desc', 'win桌面运维2'), ('detail', 'jabbok授课'), ('learn_times', 120), ('degree', 'middle'), ('students', 1), ('fav_num', 0), ('click_num', 0), ('catalog', '运维')])]
#我们也可以把一个查询集序列化,加入many=True即可。
模型序列化
上面的序列化类和Course模型是高度相似的,django提供了ModelSerializer 类,可以对序列化类做简化,并且create和updata方法都默认在里面了。
class CourseSerializer(serializers.ModelSerializer):
class Meta:
model = Course
fields = ('id', 'name', 'desc', 'detail', 'learn_times', 'degree','students','fav_num','click_num','catalog')
class CourseSerializer(serializers.ModelSerializer):
class Meta:
model = Course
fields = '__all__'
#如果序列化所以字段,就是要__all__
from courses.serializer import CourseSerializer
serializer = CourseSerializer()
print(repr(serializer))
CourseSerializer():
id = IntegerField(label='ID', read_only=True)
name = CharField(label='课程名称', max_length=64)
desc = CharField(label='课程描述', max_length=512)
detail = CharField(label='课程详情', style={'base_template': 'textarea.html'})
learn_times = IntegerField(label='课程时长(分钟数)', max_value=2147483647, min_value=-2147483648, required=False)
degree = ChoiceField(choices=(('hard', '较难'), ('middle', '中级'), ('easy', '简单')), label='课程难度')
students = IntegerField(label='学习人数', max_value=2147483647, min_value=-2147483648, required=False)
fav_num = IntegerField(label='收藏人数', max_value=2147483647, min_value=-2147483648, required=False)
click_num = IntegerField(label='点击数', max_value=2147483647, min_value=-2147483648, required=False)
catalog = CharField(label='课程类别', max_length=32)
#以上方法可以查看序列化类中包含的字段,可见,model中的字段都被继承过来了。
重写.create() update()
使用django常规view提供web API
from django.http import HttpResponse, JsonResponse
from django.views.decorators.csrf import csrf_exempt
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser from .models import Course
from .serializer import CourseSerializer @csrf_exempt
def course_list(request):
"""
List all courses, or create a new course.
"""
if request.method == 'GET':
courses = Course.objects.all()
serializer = CourseSerializer(courses, many=True)
return JsonResponse(serializer.data, safe=False) elif request.method == 'POST':
data = JSONParser().parse(request)
serializer = CourseSerializer(data=data)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data, status=201)
return JsonResponse(serializer.errors, status=400) @csrf_exempt
def course_detail(request, pk):
"""
Retrieve, update or delete a code course.
"""
try:
course = Course.objects.get(pk=pk)
except Course.DoesNotExist:
return HttpResponse(status=404) if request.method == 'GET':
serializer = CourseSerializer(course)
return JsonResponse(serializer.data) elif request.method == 'PUT':
data = JSONParser().parse(request)
serializer = CourseSerializer(course, data=data)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data)
return JsonResponse(serializer.errors, status=400) elif request.method == 'DELETE':
course.delete()
return HttpResponse(status=204)
urlpatterns = [
path('admin/', xadmin.site.urls),
path('course/', views.course_list,name='course_list'),
path('course/<int:pk>/', views.course_detail,name='course_detail'),
]
#提供url
http http://127.0.0.1:8008/course/
#列出所有courses,调用course_list视图 http http://127.0.0.1:8008/course/1/
#传入pk参数,调用course_detail视图 #这里使用python下的httpie工具
DRF教程1-序列化的更多相关文章
- Django REST framework 中文教程1:序列化
建立环境 在我们做任何事情之前,我们将使用virtualenv创建一个新的虚拟环境.这将确保我们的包配置与我们正在开展的任何其他项目保持良好的隔离. virtualenv envsource env/ ...
- DRF中的序列化器
DRF中的序列化器详细应用 视图的功能:说白了就是接收前端请求,进行数据处理 (这里的处理包括:如果前端是GET请求,则构造查询集,将结果返回,这个过程为序列化:如果前端是POST请求,假如要对数 ...
- 【DRF框架】序列化组件
DRF框架的序列化组件 在前后端分离的应用模式中,后端仅返回前端所需的数据,返回的数据类似是JSON,因此需要使用序列化组件进行序列化再将数据返回 使用JsonResponse做序列化 # 使用Js ...
- 经历了源码的痛苦,掌握DRF的核心序列化器
目录 DRF的核心--序列化器 序列化器 什么是序列化和反序列化? 序列化 序列化demo 字段类型 字段参数 序列化自定制返回字段 方法一:在序列化类(serializers.py)中写 方法二:在 ...
- drf 教程
1, 序列化 Serialization 创建一个新环境 在做其他事之前,我们会用virtualenv创建一个新的虚拟环境.这将确保我们的包配置与我们正在工作的其他项目完全隔离. virtualenv ...
- DRF初识与序列化
一.Django的序列化方法 1.为什么要用序列化组件 做前后端分离的项目,我们前后端数据交互一般都选择JSON,JSON是一个轻量级的数据交互格式.那么我们给前端数据的时候都要转成json格式,那就 ...
- DRF分阶段序列化细化实例
DRF是分两阶段进行的. 如果是API接收数据,则是先进行Parser,将外界接收的bytes数据分析成python数据类型,其间涉及encoding操作,再进行序列化,将python数据类型保存进数 ...
- drf:筛选,序列化
1.基础 restful规范: - url:一般用名词 http://www.baidu.com/article (面向资源编程) - 根据请求方式的不同做不同操作:get,post,put,dele ...
- Java入门 - 高级教程 - 04.序列化
原文地址:http://www.work100.net/training/java-serialization.html 更多教程:光束云 - 免费课程 序列化 序号 文内章节 视频 1 概述 2 序 ...
- DRF项目之序列化器和视图重写方法的区别
我们,都知道,DRF框架是一款高度封装的框架. 我们可以通过重写一些方法来实现自定义的功能. 今天,就来说说在视图中重写和序列化器中重写方法的区别. 在视图中重写方法: 接收请求,处理数据(业务逻辑) ...
随机推荐
- Hive与impala的对比测试实验
前面几篇随笔记录了我安装环境的一些笔记,环境ok以后,自然要看看impala到底性能如何,拿他来hive做做对比: 前面hive章节中,已经建立了一张名叫chengyeliang的table,该表的结 ...
- LVS集群的负载调度
LVS集群的负载调度 章文嵩 (wensong@linux-vs.org) 转自LVS官方资料 2002 年 5 月 本文主要讲述了LVS集群的IP负载均衡软件IPVS在内核中实现的各种连接调度算法. ...
- ps 图层混合模式
- httpd 隐藏文件
问题情况, 因磁盘空间问题,使用rsync将 php工作目录下文件copy到新盘中后,出现 php服务很多目录访问返回 404,路径找不到,其实文件都存在,而且路径都是对的 解决思路. 根目录下 有个 ...
- ReentrantReadWriteLock读写锁实现分析
排他锁在同一时刻只允许一个线程进行访问,而读写锁在同一时刻允许多个读线程访问,但是在写线程访问时,所有的读线程和其他的写线程均被阻塞.读写锁内部维护了一对锁,一个读锁和一个写锁,通过分离读锁和写锁,使 ...
- linux应用之gcc编译器的安装及使用
gcc是linux系统下功能十分强大的编译器. 本人使用的是CentOS 6.6 64位系统,由于在安装系统的时候并没有勾选安装gcc编译器,因此需要自行安装gcc编译器. 使用yum安装gcc 对于 ...
- ubuntu下安装cpython 0.2x
Quick installation of cython: Step 1: Update system: sudo apt-get update Step 2: Install: cython Ate ...
- mongodb replica set 配置高性能多服务器详解
mongodb的多服务器配置,以前写过一篇文章,是master-slave模式的,请参考:详解mongodb 主从配置.master-slave模式,不能自动实现故障转移和恢复.所以推荐大家使用mon ...
- nvidia-smi 查看GPU信息字段解读
第一栏的Fan:N/A是风扇转速,从0到100%之间变动,这个速度是计算机期望的风扇转速,实际情况下如果风扇堵转,可能打不到显示的转速.有的设备不会返回转速,因为它不依赖风扇冷却而是通过其他外设保持低 ...
- @Autowired注解和启动自动扫描的三种方式(spring bean配置自动扫描功能的三种方式)
前言: @Autowired注解代码定义 @Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD, Elemen ...