一、后端发送列表、字典

  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. Learning-Python【23】:面向对象三大特性

    继承 封装 多态

  2. 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 ...

  3. 牛客-数据库SQL实战

    查找最晚入职员工的所有信息 CREATE TABLE `employees` ( `emp_no` ) NOT NULL, `birth_date` date NOT NULL, `first_nam ...

  4. cocos2d-js 小知识

    由于自己是小白,决定把零碎的cocos2d-js知识记下来. 1. 列表容器listView,去掉滚动条  _listView.setScrollBarEnabled(false); 2. escap ...

  5. 最长公共前缀(java实现)

    题目: 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow& ...

  6. 更改ssh,ftp默认端口

    1.  更改ssh端口 放置升级openssh之后做此步骤 配置文件/etc/ssh/sshd_config 注释掉Subsystem      sftp    /usr/libexec/openss ...

  7. redhat7.2安全基线BI

    (一)   Redhat linux7.2安全基线基本型(BI) 1.   密码复杂度策略 /etc/pam.d/system-auth文件中,增加内容 password requisite pam_ ...

  8. Redis实现文章投票功能

    Redis的具体操作这里就不说了,说一下需求和设计思路. 需求:自己实现一个文章投票的功能1.能够按照时间分页倒叙查看文章信息2.能够给文章投票,一个用户给一篇文章只能投票一次3.需要记录分值.每次投 ...

  9. 覃超:Facebook的项目开发流程和工程师的绩效管理机制

    覃超:Facebook的项目开发流程和工程师的绩效管理机制 http://mp.weixin.qq.com/s?__biz=MjM5MDE0Mjc4MA==&mid=2650992350&am ...

  10. javascript中的词法分析

    词法分析 JavaScript中在调用函数的那一瞬间,会先进行词法分析. 词法分析的过程: 当函数调用的前一瞬间,会先形成一个激活对象:Avtive Object(AO),并会分析以下3个方面: 1: ...