一、后端发送列表、字典

  1. 发送字典出现safe error,需要如下处理

def books(request):

    ll=[{'name':'python全站开发','price':},{'name':'linux','price':}]

    # return HttpResponse(json.dumps(ll))
return JsonResponse(ll,safe=False,json_dumps_params={'ensure_ascii':False})

  2. 发送列表,不能直接json.dumps了,需要加json_dumps_params属性了,如上

二、 request获取get.post数据

  1. 现在reques.request都是用的'.'属性拦截方法,有属性的话取值,没有的话则获取__getattr__的值

  2.request.get

  3.request.method

  4.request.data (支持urlencoded,form-data,json格式的数据),postman模拟    -------> 取代request.POST(只支持urlencoded,form-data格式的数据)

from rest_framework.views import APIView

class Book(APIView):
def get(self,request):
# 拿原来的request对象
# request._request
# print(request.method)
# print(request._request.method)
# request.POST
# request.method
return HttpResponse('get')
def post(self,request):
print(request.method)
print(request._request.method)
print(request.POST) # 用apiview之后,再取数据,从request.data
print(request.data)
return HttpResponse('post')

三、序列化组件

  三种方式

from app01 import models
序列化组建
第一种方式
class Book(APIView):
def get(self,request):
response={'status':,'msg':None}
books=models.Book.objects.all()
# ll=[]
# for book in books:
# ll.append({'name':book.name,''})
ll=[ {'name':book.name,'price':book.price} for book in books]
response['msg']='查询成功'
response['data']=ll
return JsonResponse(response,safe=False) # return HttpResponse('get')
def post(self,request): return HttpResponse('post') 第二种方式,用django子自带序列化组件
from django.core import serializers # class Book(APIView):
# def get(self,request):
# # response={'status':,'msg':None}
# books = models.Book.objects.all()
# ret = serializers.serialize("json", books)
# return HttpResponse(ret)
#
# # return HttpResponse('get')
# def post(self,request):
#
# return HttpResponse('post') # 第三种方式。drf的序列化组件 class MyResponse():
def __init__(self):
self.status =
self.msg = None @property
def get_dic(self):
return self.__dict__

from app01 import myserial
class Book(APIVIEW):
  def get(self,request):
  response = MyResponse()

# 多条
books = models.Book.objects.all()
ret=myserial.BookSer(books,many=True)
# 一条
book = self.queryset
ret = myserial.BookSer(book, many=False)
ret = self.serializer_class(instance=book, many=True)

  response.msg = '查询成功'
  response.data = ret.data
  return Jsonponse(response.get_dic,safe=False)

myserial.py

from rest_framework import serializers

class BookSer(serializers.Serializer):
nid=serializers.IntegerField()
name3=serializers.CharField(source='name')
price=serializers.CharField()
# publish_date = serializers.DateField()
publish_date = serializers.CharField()
# publish=serializers.CharField(source='publish.email')
publish=serializers.CharField(source='publish.name')
xxx=serializers.CharField(source='test')
# authors=serializers.CharField(source='authors.all')
# SerializerMethodField,可以写一个方法方法名叫:get_字段名字,方法返回值,会赋给authors
aa=serializers.SerializerMethodField()
# def get_authors(self,obj):
# authors=obj.authors.all()
# # ll=[ author.name for author in authors]
# ll=[ {'name':author.name,'age':author.age} for author in authors]
# return ll
def get_aa(self, obj):
authors = obj.authors.all()
# ll=[ author.name for author in authors]
ser=AuthorSer(authors,many=True)
return ser.data
class AuthorSer(serializers.Serializer):
id=serializers.IntegerField(source='nid')
age=serializers.CharField()
name=serializers.CharField()

总结

  序列化组价涉及到多对多查询的处理和引用对象

一 restfu(规范)
是什么:
-面向资源编程
-getBooklist:获取图书列表
-符合规范的:books
规范:
-method:get----》books----》取到所有的书 post———》books---》新增图书 put/patch--》books/id---》修改图书 delete---》books/id---》删除图书
-https://api.example.com/v1/zoos?limit=10
- 二 drf
安装(app):pip3 install djangorestframework
-基于drf写resful的接口,得写CBV
-request对象,源码分析
-APIView源码分析 三 序列化组件
- 导入:from rest_framework import serializers
- 写一个类(名字任意),继承serializers.Serializer
class BookSer(serializers.Serializer):
nid=serializers.IntegerField()
name3=serializers.CharField(source='name')
price=serializers.CharField()
# publish_date = serializers.DateField()
publish_date = serializers.CharField()
# publish=serializers.CharField(source='publish.email')
publish=serializers.CharField(source='publish.name')
xxx=serializers.CharField(source='test')
- 如果不指定source,字段名,必须跟数据库列名一致
- source--》既可以指定数据属性,又可以指定方法属性,可以写(publish.name)
- 使用:
-查询出要序列化的数据:books = models.Book.objects.all()
-ret=myserial.BookSer(books,many=True)-----》多条(queryset对象),必须指定many=True
-ret=myserial.BookSer(books,many=False)-----》一条(Book对象),必须指定many=False
- aa=serializers.SerializerMethodField()
-必须配套一个方法(get_aa(self,obj)),方法返回结果,会赋给aa
-在方法内部,可以继续用序列化组件

四、序列化组件之serializers.ModelSerializer

1、使用

from app01 import models
class BookSer(serializers.ModelSerializer):
class Meta:
# 指定要序列号的表模型是book
model=models.Book
# 把所有字段都序列化
# fields='__all__'
# 可以传列表,指定取几个
# fields=['name','authors','publish']
# 除了nid都查
exclude=['authors']
#fields和exclude不能同时用
# depth指定深度,个人建议最多用3
# depth=

2、ps

四 序列化组件之serializers.ModelSerializer
-用法同Serializer
-不同点:
class BookSer(serializers.ModelSerializer):
class Meta:
# 指定要序列号的表模型是book
model=models.Book
fields='__all__'
exclude=['nid']
depth=1

五 序列化组件的字段校验和反序列化功能

序列化组件可以将对象序列化成字典,也可以将字典反序列化成对象,调用save()方法,保存前台传过来的数据

    -只有:ModelSerializer,能直接保存
- def post(self,request):
print(request.data)
#生成一个序列化对象
ser=myserial.BookSer(data=request.data)
#判断字段是否校验通过
if ser.is_valid():
#通过,直接保存
ser.save()
else:
#错误信息
print(ser.errors) return HttpResponse('post')

使用

from app01 import models
class BookSer(serializers.ModelSerializer):
class Meta:
# 指定要序列号的表模型是book
model=models.Book
# 把所有字段都序列化
fields='__all__'
# 可以传列表,指定取几个
# fields=['name','authors','publish']
# 除了nid都查
exclude=['authors']

restframework细节学习的更多相关文章

  1. JS性能细节学习初步总结

    1,声明变量要赋初值2,尽量避免声明全局变量,可以减少与系统的重名3,当编写大量js代码时,难免会遇到命名冲突,这是可以通过模拟命名空间方式     来避免冲突4,尽量避免使用全局变量,搜索全局变量是 ...

  2. 20170906工作日记--volley源码的相关方法细节学习

    1. 在StringRequest类中的75行--new String();使用方法 /** * 工作线程将会调用这个方法 * @param response Response from the ne ...

  3. C细节学习

    字符串ascii码值比较compress函数;

  4. SpringMVC 细节学习

    使用Spring MVC,配置DispatcherServlet是第一步  DispatcherServlet是前置控制器,配置在web.xml文件中的 .拦截匹配的请求,Servlet拦截匹配规则要 ...

  5. DICOM医学图形处理:storescp.exe与storescu.exe源码剖析,学习C-STORE请求(续)

    转载:http://blog.csdn.net/zssureqh/article/details/39237649 背景: 上一篇博文中,在对storescp工具源文件storescp.cc和DcmS ...

  6. django学习~models之查询

    一 简介:今天学习models查询的一些东西 二 理解概念 Queryset 定义 从数据库中查询出来的结果一般是一个集合,这个集合叫做 QuerySet 三 细节学习 一 常用的models函数 . ...

  7. Mysql学习---基础操作学习2

    基本数据类型 Mysql基本数据类型:二进制,数值[整数,小数].字符串[定长,变长]. 二进制数据.时间和枚举集合 bit[(M)] 二进制位(101001),m表示二进制位的长度(1-64),默认 ...

  8. mina框架之---服务端NioSocketAcceptor的学习

    接上一讲对mina的简单应用和对mina服务端和客户端中几个重要的技术知识点的理解后,今天着重对mina服务端的NioSocketAcceptor 进行学习. 说这个玩意之前,先整体上看一下在mina ...

  9. Linux学习教程

    前言 “Linux?听说是一个操作系统,好用吗?” “我也不知道呀,和windows有什么区别?我能在Linux上玩LOL吗” “别提了,我用过Linux,就是黑乎乎一个屏幕,鼠标也不能用,不停地的敲 ...

随机推荐

  1. bzoj1001狼抓兔子 对偶图优化

    bzoj1001狼抓兔子 对偶图优化 链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1001 思路 菜鸡总是要填坑的! 很明显让你求网格图的最 ...

  2. HTML基础【1】:认识 HTML

    什么是HTML ​ HTML其实是 HyperText Markup Language 的缩写,超文本标记语言 HTML的作用 1.首先利用记事本保存了一个标题和两段描述, 然后修改纯文本文件的扩展名 ...

  3. How to fix TFS workspace mapping error in Jenkins

    Once you had update in TFS workspace for Jenkin TFS plugin, you might get error like bellow: [worksp ...

  4. .NET Core 配置GC工作模式与内存的影响

    .NET Core 配置GC工作模式与内存的影响 .NET Core GC 原文:https://blog.markvincze.com/troubleshooting-high-memory-usa ...

  5. Apache web服务器(LAMP架构)

    Apache web服务器(LAMP架构) apache介绍 1).世界上使用率最高的网站服务器,最高时可达70%:官方网站:apache.org 2).http 超文本协议 HTML 超文本标记语言 ...

  6. CSS 简介 3

    css css 外边距属性 margin 简写属性 在一个声明中设置所有外边距属性 margin-bottom 设置元素的下外边距 margin-left 设置元素的左外边距 margin-right ...

  7. java IO和NIO区别

    面向流与面向缓冲 Java NIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的. Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方 ...

  8. 问题1——之Linux虚拟机ip地址消失

    原文转自 https://blog.csdn.net/keep_walk/article/details/75115926 以前一直通过ifconfig命令查看ip地址,但是今天用XShell连接自己 ...

  9. Windows 2003 Server R2 x64 IIS6.0 eWebEditor无法显示的问题

    64位的操作系统安装成功后,一般IIS也是默认的64位的解析,所以将程序放到64位操作系统上的时候,会出现IIS错误,解决方案也非常简单,将64位IIS停止,启动32位的就可以了. 输入以下命令启用 ...

  10. VSTO学习问题(一)

    入门按照网上的写了第一个VSTO外接程序,点击运行按钮进行调试,发生错误: 名称: 从: file:///D:/Program Files (x86)/Microsoft Visual Studio ...