drf第三日

  • 一 修改,删除接口
    • views.py 的cbv下
    • serializer.py
  • 二 高级用法之source
  • 三 模型类序列化器
  • 四 高级用法之SerializerMethodField
  • 五 drf的请求与响应
    • Request
    • Response
    • 自己封装一个Response对象
  • 七 many=True源码分析,局部全局钩子源码解析

一 修改,删除接口

views.py 的cbv下

    def put(self, request, id):# 通过id取到对象res = {'code': 100, 'msg': ''}try:book = models.Book.objects.get(id=id)# data: put传过来的,实现修改的数据  instance: 要被修改的对象ser = BookSerializer(instance=book, data=request.data)  # 这句就产生了修改后的对象ser.is_valid(raise_exception=True)ser.save()  # 将修改后的数据更新或创建到表中,这里的这个需要重写BookSerializer里的create方法res['msg'] = '修改成功'res['result'] = ser.dataexcept Exception as e:res['code'] = 101res['msg'] = str(e)return Response(res)def delete(self,request,id):response = {'code': 100, 'msg': '删除成功'}models.Book.objects.filter(id=id).delete()return Response(response)

serializer.py

class BookSerializer(serializers.Serializer):id = serializers.IntegerField(required=False)title = serializers.CharField(max_length=32,min_length=2)price = serializers.DecimalField(max_digits=5, decimal_places=2)publish = serializers.CharField(max_length=32)def create(self, validated_data):  # 规定目标的表,并且添加字段res=models.Book.objects.create(**validated_data)print(res)return res# 修改字段的函数def update(self, book, validated_data):  # 第三个参数是自动传入的,通过校验的字典book.title=validated_data.get('title')book.price=validated_data.get('price')book.publish=validated_data.get('publish')book.save()return book

二 高级用法之source

  1. 修改返回到前端的字段名
    注意点: 如果想用source=title,那么字段名就不能再叫title,鱼和熊掌不可兼得
    name = serializers.CharField(max_length=32,min_length=2,source='title')
    于是乎返回给前端的字典,对应这个字段的key就是title
  2. 如果表模型中有方法
    执行表模型中的test方法,并且把返回值赋值给xxx
    xxx=serializers.CharField(source='test')
    假如text()返回的是一个字符串'我是字符串'那么前端接收的该字段对应的key就是'我是字符串'
  3. sourc支持跨表操作
    addr=serializers.CharField(source='publish.addr')
    这里实际上跨了两个表

    1. obj.publish
    2. publish.addr

三 模型类序列化器

  1. 原来用的Serilizer跟表模型没有直接联系, 模型类序列化器ModelSerilizer,跟表模型有对应关系,底层也是继承了Serilizer

  2. 使用语法

    class BookModelSerializer(serializers.ModelSerializer):class Meta:model=表模型    # 跟哪个表模型建立关系fields=[字段,字段] # 序列化的字段,反序列化的字段fields='__all__' # 所有字段都序列化,反序列化exclude=[字段,字段] # 排除哪些字段(不能跟fields同时使用)read_only_fields=['price','publish']  # 序列化显示的字段write_only_fields=['title']           # 反序列化需要传入的字段extra_kwargs ={'title':{'max_length':32,'write_only':True}}  # 修改字段属性depth=1  # 了解,跨1张表的幅度,查询所有数据,最多建议写3# 重写某些字段 这个必须放在Meta外面,不能放在里面publish = serializers.CharField(max_length=32,source='publish.name')# 局部钩子,全局钩子,跟原来完全一样
    
  3. 新增,修改
    统统不用重写createupdate方法了,在ModelSerializer已经重写了createupdate

四 高级用法之SerializerMethodField

# 第一种 继承Serializer的写法
class BookSerializer(serializers.Serializer):id = serializers.IntegerField(required=False)name = serializers.CharField(max_length=32,min_length=2,source='title')price = serializers.DecimalField(max_digits=5, decimal_places=2)publish = serializers.SerializerMethodField()def get_publish(self,obj):dic={'name':obj.publish.name,'addr':obj.publish.addr}return dic第二种 继承ModelSerializer的写法
class BookModelSerializer(serializers.ModelSerializer):class Meta:model = models.Bookfields = '__all__'publish = serializers.SerializerMethodField()  # 注意这俩一定要在Meta外面def get_publish(self,obj):dic={'name':obj.publish.name,'addr':obj.publish.addr}return dic## 第三种方案,使用序列化类的嵌套
class PublishSerializer(serializers.ModelSerializer):class Meta:model = models.Publish# fields = '__all__'fields = ['name','addr']class BookModelSerializer(serializers.ModelSerializer):publish = PublishSerializer()  # 直接套用序列化的类class Meta:model = models.Bookfields = '__all__'

五 drf的请求与响应

Request

data :前端以post请求提交的数据都在它中
FILES :前端提交的文件
query_params:就是原来的request.GET
因为重写了__getattr__
所以使用新的request.method其实取得就是原生request.method(通过反射实现)

Response

导入语法:from rest_framework.response import Response
data:响应的字典
status:http响应的状态码
drf提供给你了所有的状态码,以及它的意思
from rest_framework.status import HTTP_201_CREATED
template_name:模板名字(一般不动),了解
headers:响应头,字典
content_type:响应的编码方式,了解

自己封装一个Response对象

class CommonResponse:def __init__(self):self.code=100self.msg=''@propertydef get_dic(self):return self.__dict__
  • 自己封装一个response,继承drf的Response

然后通过配置,选择默认模板的显示形式(浏览器方式,json方式)

  1. 配置文件方式(全局)
    如果没有配置,默认有浏览器和json
    -drf有默认配置文件

    from rest_framework.settings import DEFAULTS
    REST_FRAMEWORK = {'DEFAULT_RENDERER_CLASSES': (  # 默认响应渲染类'rest_framework.renderers.JSONRenderer',  # json渲染器'rest_framework.renderers.BrowsableAPIRenderer',  # 浏览API渲染器
    )
    }
    
  2. 在视图类中配置(局部)
    -粒度更小

    from rest_framework.renderers import JSONRenderer
    class BookDetail(APIView):renderer_classes=[JSONRenderer,]  # 列表中可以导入更多
    

七 many=True源码分析,局部全局钩子源码解析

  1. many=True
    __init__----->一路找到了BaseSerializer—》__new__决定了生成的对象是谁

  2. 入口是is_valid()—》BaseSerializer–》is_valid—》self._validated_data = self.run_validation(self.initial_data)
    Serializer这个类的:self.run_validation

    def run_validation(self, data=empty):value = self.to_internal_value(data)  # 局部字段自己的校验和局部钩子校验try:self.run_validators(value)value = self.validate(value)  # 全局钩子的校验except (ValidationError, DjangoValidationError) as exc:raise ValidationError(detail=as_serializer_error(exc))return value
    

Django学习 day79之drf第三日相关推荐

  1. 千锋Django学习笔记

    千锋Django学习笔记 文章目录 千锋Django学习笔记 写在前面 1. MVC和MTV 2. Django简介 3. MTV简单流程 4. 和Model的简单对接 5. Model 6. Tem ...

  2. Django介绍和虚拟环境(django特点、MVC、MVT、Django学习资料)

    MVT流程: 创建Django项目和应用 django-admin startproject name python manager.py startapp name 视图和ULR 视图的请求和响应 ...

  3. django学习之路(五)站点管理admin - django - 一直很安静 - Powered by Discuz!

    django学习之路(五)站点管理admin - django - 一直很安静 - Powered by Discuz!: "" (Via.) 转载于:https://www.cn ...

  4. django 学习笔记

    django 学习笔记 启动虚拟机: workon bj18_py3 创建一个项目: django-admin.py startproject mysite 启动开发用服务器:从外层项目 mysite ...

  5. 分享:Django学习笔记(4)---ManyToMany 添加、删除关联、查询

    Django学习笔记(4)---ManyToMany 添加.删除关联.查询 http://my.oschina.net/u/572994/blog/105280

  6. Django学习总结①

    Django学习总结① Django基础环境配置好以后,打开pycharm,创建Django项目 视图views 中需要导入 django.http ---> HttpResponsemodel ...

  7. Django学习目录

    Django学习目录 Django框架简介 Django基础 >>点我 ORM介绍 Django中ORM介绍 >>点我 ORM表操作 Django中ORM表相关操作 >& ...

  8. Python Web框架Django学习(二)

    python web框架Django学习(二) 目录:  三.Django创建APP  四.创建登录页面,实现用户交互,后台管理用户(非数据库方式) ========================= ...

  9. Django学习之十: staticfile 静态文件

    目录 Django学习之十: staticfile 静态文件 理解阐述 静态文件 Django对静态文件的处理 其它方面 总结 Django学习之十: staticfile 静态文件 理解阐述 静态文 ...

最新文章

  1. MySQL 账户管理
  2. C语言实现了一个具有头结点的单链表(附完整源码)
  3. 结合Apache Kafka生态系统,谈谈2018年机器学习5大趋势
  4. 书店看不要钱的JS笔记
  5. servlet和JSP页面乱码问题
  6. JQuery技巧总结【转】
  7. 微信小程序在线旅游信息管理+后台管理系统
  8. 国外变电站3d可视化技术发展_盘点:测量技术五大发展趋势,含3D扫描
  9. 【管理度量网络安全风险】丨上海道宁为您带来强大的Tenable漏洞及风险管理解决方案
  10. c语言装b程序,C语言打造表白和装逼利器:亲爱的让我们相爱在一起,酷炫的梦幻...
  11. 时区缩写与UTC(GMT)时差对照表
  12. 唐迟长难句逻辑思维导图(含英语高分笔记)
  13. 这十大推广引流渠道,你做了几个?(二)
  14. 程序设计思维与实践 Month3 模拟
  15. 神经系统分类和组成图表,神经系统的组成概念图
  16. 【强基计划】数学与物理竞赛中的微积分部分视频
  17. 编译原理实验Sicily--LR(K) 语法分析程序
  18. 在LINUX下安装的程序,root运行提示权限不够?!
  19. 记录在IDEA上使用连接池C3P0操作MySQL的一个问题
  20. LSB:Linux标准规范

热门文章

  1. win11(amd)+cuda+cudnn+pytorch安装过程
  2. 如何改变图片的尺寸大小得到一张缩小后的图片
  3. Python读取显示raw图片+numpy基本用法记录
  4. 前端三件套之css笔记
  5. 陈景润定理对筛法理论的重要贡献
  6. 微信和抖音都到十亿级用户了,作为产品经理的你们觉得哪个产品更成功?
  7. 写在“华为伙伴暨开发者大会”前夕:给昇腾AI划三个重点
  8. hue-登录相关-简
  9. OI生涯回忆录(Part6:至高一NOIP考试结束)
  10. 从国产浏览器更换到谷歌浏览器的心路历程