当前位置: 首页 > news >正文

DRF教程1-序列化

序列化类

要建立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中的字段都被继承过来了。

  

使用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工具

  

 

 

转载于:https://www.cnblogs.com/jabbok/p/10550956.html

相关文章:

  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • 一个iOS开发者的Flutter“历险记”
  • 12. 掌握Dart最基础的导包操作
  • 魔鬼存在于细节中:从Redshift迁移到ClickHouse后再无数据丢失
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林
  • JQuery知识总结之选择器
  • 读书之法,在循序而渐进,熟读而精思。
  • REdis CPU百分百问题分析
  • abp 关于service 服务的定义
  • ORACLE-2
  • 第一章 初识Python
  • 吴恩达机器学习系列12:反向传播算法
  • Oracle_11g
  • 数据科学家为什要用Git?怎么用?
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 【前端学习】-粗谈选择器
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • django开发-定时任务的使用
  • Javascript编码规范
  • Javascript弹出层-初探
  • Java的Interrupt与线程中断
  • java概述
  • Less 日常用法
  • Meteor的表单提交:Form
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • STAR法则
  • vuex 学习笔记 01
  • 订阅Forge Viewer所有的事件
  • 反思总结然后整装待发
  • 使用权重正则化较少模型过拟合
  • 学习笔记TF060:图像语音结合,看图说话
  • 原生 js 实现移动端 Touch 滑动反弹
  • 第二十章:异步和文件I/O.(二十三)
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • (4)(4.6) Triducer
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (第一天)包装对象、作用域、创建对象
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (过滤器)Filter和(监听器)listener
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (十)T检验-第一部分
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (原創) 物件導向與老子思想 (OO)
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)平衡树
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .Mobi域名介绍