一、后端发送列表、字典

  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. 王之泰201771010131《面向对象程序设计(java)》第三周学习总结

    王之泰201771010131<面向对象程序设计(java)>第三周学习总结 第一部分:理论知识复习部分 第一章 回顾了Java“白皮书”的关键性语句,再次理解了以前未理解的句子.对Jav ...

  2. TabBar + TabBarView导航风格

    import 'package:flutter/material.dart'; import 'News.dart'; import 'Video.dart'; import 'Chat.dart'; ...

  3. (转载)UnityShader学习笔记(七) 让贴图纹理动起来(河流瀑布特效、精灵序列帧实现)

    大家好,我是Zander.这一章我们将使用纹理贴图实现动画.混合和真实特效来达到理想的效果. 纹理贴图可以使我们的着色器快速的实现逼真的效果,但是如果添加的纹理贴图过多,会非常影响游戏性能,特别是在移 ...

  4. Learning-Python【15】:内置函数

    截止到Python版本3.6.2,一共为我们提供了68个内置函数.它们就是Python提供的直接可以拿来使用的所有函数. 这个表的顺序是按照首字母的排列顺序来的,都混乱的堆在一起.比如,oct和bin ...

  5. Dockerfile文件详解

    什么是dockerfile? Dockerfile是一个包含用于组合映像的命令的文本文档.可以使用在命令行中调用任何命令. Docker通过读取Dockerfile中的指令自动生成映像. docker ...

  6. 6th-Python基础——集合、函数

    1.集合 主要作用: (1)去重 (2)关系测试,交集.差集difference().并集union().反向差集symmetric_difference().子集issubset().父集issup ...

  7. spring-cloud-config——Quick Start

    参考资料: https://cloud.spring.io/spring-cloud-static/spring-cloud-config/1.4.0.RELEASE/single/spring-cl ...

  8. 雷林鹏分享:jQuery EasyUI 数据网格 - 列运算

    jQuery EasyUI 数据网格 - 列运算 在本教程中,您将学习如何在可编辑的数据网格(datagrid)中包含一个运算的列.一个运算列通常包含一些从一个或多个其他列运算的值. 首先,创建一个可 ...

  9. Java中char和String的相互转换

    转自:http://blog.csdn.net/yaokai_assultmaster/article/details/52082763 Java中char是一个基本类型,而String是一个引用类型 ...

  10. 如何正确使用QThread

    如何正确使用QThread https://www.2cto.com/kf/201609/550462.html