DRF 的 版本,解析器,与序列化


补充 配置文件中的 类的调用:

(字符串)
v1 = ["view.xx.apth.Role","view.xx.apth.Role"] for item in v1:
m = importlib.import_module('view.xx.apth')
cls = getattr(m,'Role')
cls()

1 版本控制

一般是全局的 配置

1 基于 参数版本控制

versioning_class = QueryParameterVersioning # 默认参数是 version

version = request.version  # 获取到参数会放置在 request中

2 基于 url 版本控制

 versioning_class = URLPathVersioning

 url 规则 (?P < version > [v1 | v2] +) 

 print(request.versioning_scheme.reverse(viewname='api:user', request=request))  这里可以通过request.versioning_scheme.reverse 进行url 反向解析
>> http: // 127.0.0.1: 8000 / api / v2 / user /

3 基于 host域名 版本控制

versioning_class = HostNameVersioning

http: // v1.bpple.com: 8000 / api / user /

4 当然 可以 配置到 全局中 和 视图

'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.HostNameVersioning'
‘VERSION_PARAM’:‘version
'ALLOWED_VERSIONS':['v1','v2']
'DEFAULT_VERSION':'v1'

2 解析器

Django 的 数据解析

在 django 中,满足如下两个条件时候

    1 请求头中 Content-Type : application/x-www-form-urlencoded,
2 数据格式: name=alex&age=18 request.POST 中才有值 比如 form 表单提交 满足 1,2 ajax 提交的时候也是默认 1,2 条件 当然可以定义 ajax 发送的请求头和数据格式:
headers:{'Content-Type':'application/json'}
data:JSONstringfy({name:'aaa',age:12}) 这时候 后台 request.POST 中不再有数据
可以从 request.BODY 中获取数据

restfuframelwork对数据的解析 - 请求体进行解析

        注意:只有使用 request.data的时候,parser对象才调用

        #如果客户端的Content-Type的值和 application/json 匹配:JSONParser处理数据
#如果客户端的Content-Type的值和 application/x-www-form-urlencoded 匹配:FormParser处理数据 1 获取用户的请求
2 获取用户的请求体
3 根据用户的请求头 和 parser_classes 中支持的 parser 进行比较
4 parser对象 去请求
5 request.data

视图级别配置

class GoodsVieW(APIView):
parser_classes = [JSONParser,FormParser] #表示服务端可以解析的数据格式的种类。
def post(self,request,*args,**kwargs):
#必须要调用才能启动解析器,然后解析器先判断content-type,
#如果和解析器要解析数据的类型一致,那么开始解析返回数据。
request.data
#如果客户端的Content-Type的值和 application/json 匹配:JSONParser处理数据
#如果客户端的Content-Type的值和 application/x-www-form-urlencoded 匹配:FormParser处理数据

全局配置

全局配置,简称全配:
settings.py中: REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES':[
'rest_framework.parsers.JSONParser',
'rest_framework.parsers.FormParser',
]
}

3 序列化

rest_framework 序列化 -- 更好的使用queryset

对象 -->> 字符串 序列化
字符串 -->> 对象 反序列化

1 基本实现

序列化的模板

    class UserSerializer(serializers.Serializer):
name = serializers.CharField()
pwd = serializers.CharField() 多个 user_list = UserInfo.objects.all()
ser = UserSerializer(user_list,many=True) 单个对象 user = UserInfo.objects.all().first()
ser = UserSerializer(user,many=False) 返回
return Response(ser.data)

2 跨表处理

serializer

	class UserSerializer(serializers.Serializer):
name = serializers.CharField()
pwd = serializers.CharField()
group_id = serializers.CharField()
group_title = serializers.CharField(source='group.title')
choices = serializer.CharField(source='get_type_display')
menu_id = serializers.CharField(source='group.menu_id')
menu_name = serializers.CharField(source='group.menu.name') model class Menu(models.Model):
name = models.CharField(max_length=32) class Group(models.Model):
title = models.CharField(max_length=32)
menu = models.ForeignKey(to='Menu',default='1') class UserInfo(models.Model):
name = models.CharField(max_length=32)
pwd = models.CharField(max_length=32)
group = models.ForeignKey(to='Group')

3 ModelSerializer

基本使用

class UserSerializer(serializers.ModelSerializer):
class Meta:
model = UserInfo
# fields = ('name','pwd',)
fields = '__all__'

modelserializer的嵌套

user 表的外键 group ,group的外键 menu	

class MenuSerializer(serializers.ModelSerializer):
class Meta:
model = Menu
fields = '__all__' class GroupSerializer(serializers.ModelSerializer):
menu = MenuSerializer()
class Meta:
model = Group
fields = '__all__' class UserSerializer(serializers.ModelSerializer):
group = GroupSerializer() # 通过外键直接关联实例化的对象
class Meta:
model = UserInfo
# fields = ('name','pwd',)
fields = '__all__' ---------------------------------------------------------------------------------------------------------------
等同于
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = UserInfo
fields = '__all__'
depth = 2 默认是0 只有表层 ,指定深度会拿出所有的关联 | 不超过10层

补充:

1 select的显示 get _字段 _ display

    serializer.CharField(source='get_user_type_display')

2 通过 SerializerMethodField() # 自定义显示字段

    def get_xxx(self,row):
return row

3 # modelserializer 自动关联数据表

      class UserInfoSerializer(serializers.ModelSerializer):
info = serializers.CharField(source='get_user_type_display')
roles = serializers.SerializerMethodField() def get_roles(self,row):
return [{obj.id:obj.title} for obj in row.role.all()] class Meta:
model = UseInfo
fields = ['id','username']
extra_kwargs = {
'group':{'source':'gourp.title'}
}

4 自定义 field 类 字段

        class MyField(serializers.CharField):
def to_representation(self, value):
return '{0}***'.format(value) class Serializer_(serializers.Serializer):
username = serializers.CharField(error_messages={'required':'请输入姓名'},validators=[MyValidator])
pwd = MyField()

5 生成连接

    url(r'^api/(?P<version>[v1|v2]+)/(?P<pk>\d+)/',UserGroupView.as_view(),name='group')

    class UserInfoSerializer(serializers.Serializer):
group = serializers.HyperlinkedIndentityField(view_name='group',lookup_id='group.id',lookup_url_kwarg='')
class Meta:
model = UserInfo
fields = '__all__' class UserInfoView(APIView):
obj = UserInfo.objects.get(...)
ser = UserInfoSerializer(instance=obj,many=False,context={"request":request}) return JsonResponse(ser.data)

6 自定义validator

class MyValidator(object):
def __init__(self,base):
self.base = base def __call__(self, value):
if not value.startswith(self.base):
msg = '情以%s 开头'% self.base
raise exceptions.ValidationError(msg, code='unique') class Serializer_(serializers.Serializer):
username = serializers.CharField(error_messages={'blank':'请输入姓名'},validators=[MyValidator('he')])

7 自定义 钩子 validate_field

class Serializer_(serializers.Serializer):
username = serializers.CharField(error_messages={'blank':'请输入姓名'},validators=[MyValidator('he')])
pwd = serializers.CharField() def validate_pwd(self,value):
if not value.startswith('123'):
raise exceptions.ValidationError('密码情以123开头', code='unique')
return value {
"pwd": [
"密码情以123开头"
]
}

8 全局钩子

def validate(self, value):
if value.get('pwd') == value.get('repwd'):
return value
raise exceptions.ValidationError('两次密码不一致') {
"non_field_errors": [
"两次密码不一致"
]
}

DRF 的 版本,解析器,与序列化的更多相关文章

  1. Django Rest Framework(版本、解析器、序列化、数据验证)

    一.版本 程序也来越大时,可能通过版本不同做不同的处理 没用rest_framework之前,我们可以通过以下这样的方式去获取. class UserView(APIView): def get(se ...

  2. DRF(2) - 解析器,序列化组件使用(GET/POST接口设计)

    一.DRF - 解析器 1.解析器的引出 我们知道,浏览器可以向django服务器发送json格式的数据,此时,django不会帮我们进行解析,只是将发送的原数据保存在request.body中,只有 ...

  3. Restful 2 --DRF解析器,序列化组件使用(GET/POST接口设计)

    一.DRF - 解析器 1.解析器的引出 我们知道,浏览器可以向django服务器发送json格式的数据,此时,django不会帮我们进行解析,只是将发送的原数据保存在request.body中,只有 ...

  4. django的rest framework框架——版本、解析器、序列化

    一.rest framework的版本使用 1.版本可以写在URL中,通过GET传参,如 http://127.0.0.1:8082/api/users/?version=v1 (1)自定义类获取版本 ...

  5. rest framework的框架实现之 (版本,解析器,序列化,分页)

    一版本 版本实现根据访问的的方式有以下几种 a : https://127.0.0.1:8000/users?version=v1  ---->基于url的get方式 #settings.pyR ...

  6. DRF url控制 解析器 响应器 版本控制 分页(常规分页,偏移分页,cursor游标分页)

    url控制 第二种写法(只要继承了ViewSetMixin) url(r'^pub/$',views.Pub.as_view({'get':'list','post':'create'})), #获取 ...

  7. DRF的解析器和渲染器

    解析器 解析器的作用 解析器的作用就是服务端接收客户端传过来的数据,把数据解析成自己可以处理的数据.本质就是对请求体中的数据进行解析. 在了解解析器之前,我们要先知道Accept以及ContentTy ...

  8. DRF 的解析器和渲染器

    一.解析器 解析器作用 解析器的作用就是服务端接收客户端传过来的数据,把数据解析成自己可以处理的数据.本质就是对请求体中的数据进行解析. 在了解解析器之前,我们要先知道Accept以及ContentT ...

  9. 【DRF解析器和渲染器】

    目录 解析器 Django中的解析器 DRF中的解析器 DRF中的渲染器 @ *** 解析器 解析器的作用就是服务端接收客户端传过来的数据,把数据解析成自己想要的数据类型的过程. 本质就是对请求体中的 ...

  10. Django REST framework基础:解析器和渲染器

    解析器 解析器的作用 解析器的作用就是服务端接收客户端传过来的数据,把数据解析成自己可以处理的数据.本质就是对请求体中的数据进行解析. 在了解解析器之前,我们要先知道Accept以及ContentTy ...

随机推荐

  1. CKEditor的下载、配置与使用

    CKEditor简介: CKEditor 是一款功能强大的开源在线文本编辑器.它所见即所得的特点,使你在编辑时所看到的内容和格式,能够与发布后看到的效果完全一致.CKEditor 完全是基于 Java ...

  2. pandas(六)读写文本格式的数据

    pandas提供的将表格型数据读取为DataFrame对象的函数. 函数 说明 read_csv 从文件.URL.文件型对象中加载带分隔符的数据.默认分隔符为逗号. read_table 从文件.UR ...

  3. jQuery Mobile 手动显示ajax加载器

    在jquery mobile开发中,经常需要调用ajax方法,异步获取数据,如果异步获取数据方法由于网速等等的原因,会有一个反应时间,如果能在点击按钮后数据处理期间,给一个正在加载的提示,客户体验会更 ...

  4. 转:.Net 中的反射(反射特性) - Part.3

    .Net 中的反射(反射特性) - Part.3 反射特性(Attribute) 可能很多人还不了解特性,所以我们先了解一下什么是特性.想想看如果有一个消息系统,它存在这样一个方法,用来将一则短消息发 ...

  5. nodejs的http.request使用post方式提交数据请求

    官方api文档 http://nodejs.org/docs/v0.6.1/api/http.html#http.request虽然也有POST例子,但是并不完整. 直接上代码:http_post.j ...

  6. 解读dbcp自动重连那些事(转)

    本文转自:http://agapple.iteye.com/blog/791943 可以后另一篇做对比:http://agapple.iteye.com/blog/772507 borrow 借,从连 ...

  7. js 三元表达式 复杂写法

    a = 0 b = 0 a === 0 && (a = 1,b = 2) a === 1 ? (a = 3,alert(b)) : (b = 4) a === 1 || alert(a ...

  8. Qt5.5.1移植到freescale imx6

    一.环境 HOST:ubuntu12.04-LTS Embedded:freescale imx6 linux-3.0.35 CROSS_COMPILE:freescale提供的gcc-4.6.2-g ...

  9. Grid 行和列

    <Grid> <Grid.ColumnDefinitions> <ColumnDefinition></ColumnDefinition> <Co ...

  10. HTML5堆木头游戏

    在线演示 本地下载