1.APIview使用
 
https://www.cnblogs.com/xiaonq/p/10124104.html
https://www.cnblogs.com/xiaonq/p/10987889.html
  ModelViewSet 是对 APIView 封装
  ModelSerializer 是对 Serializer
 
1.1 在 user/urls.py 中添加路由
 
urlpatterns = [
  path('apiview/', views.UserInfoViewSet.as_view()),
]
 
1.2 创建user/serializers.py写序列化器
 
serializers.ModelSerializer 和 serializers.Serializer field参数说明
 
''' field参数 '''
# 1.read_only
read_only=True 表示不允许用户自己上传,只能用于api的输出,序列化的时候也不用对这个数据进行验
证,序列化返回是有改字段
# 2.write_only
write_only=True 表示在更新或创建实例时可以使用该字段,但在序列化返回时不包括该字段。
# 3.required:该字段是必需的,不能为空
required=True 反序列化(前端返回数据必须包含此字段)的时候必须提供这个字段 设置False 可以
不提供
# 4.allow_null/allow_blank:该字段允许为null/空
allow_null=True 可以为null 设置False则不能为null
# 5.label:标签,用于对字段显示设置
# 6.help_text:对字段进行解释的一段文本,用于提示
# 7.style:说明字段的类型
# 8.error_messages:字段出错时,信息提示
 
创建user/serializers.py写序列化器

# class User(AbstractUser):
  # phone = models.CharField('手机号',max_length=20)
  # img = models.ImageField(upload_to='user',null=True)
  # nick_name = models.CharField('昵称',max_length=20)
  # address = models.CharField('地址',max_length=255)
 
class UserInfoSerializer(serializers.Serializer):
  id = serializers.CharField(read_only=True) # 普通字段,设置id为只读字段,不能修改
  username = serializers.CharField(min_length=3,max_length=20,error_messages={'required': '该字段必填'}) # 显示普通字段
  img = serializers.ImageField(required=False)
  nick_name = serializers.CharField(max_length=20)
  address = serializers.CharField(max_length=255)
  xxx = serializers.SerializerMethodField(read_only=True) # 自定义显示(显示多对多)
 
  class Meta:
    model = User
 
  # 自定义显示 多对多 字段
  def get_xxx(self,row):
    '''row: 传过来的正是 User表的对象'''
    users = row.username # 获取用户名
    return users
 
  # 定义创建语法:ser.save()执行,就会立刻调用create方法用来创建数据
  def create(self, validated_data):
    '''validated_data: 表单或者vue请求携带的json:{"username":"zhangsan","password":"123456"}'''
    # https://www.cnblogs.com/xiaonq/p/7978409.html
    return User.objects.create(**validated_data)
 
  # 定义更新方法
  def update(self, instance, validated_data):
    '''
      instance : 查询的对象1.3 在 user/views.py 中添加视图函数
      validated_data : postman提交的json数据
      {"username":"zhangsan","password":"123456"}
    '''
    if validated_data.get('username'):
    instance.username = validated_data['username']
    instance.save()
    return instance
 
  # 定义单一字段验证的方法
  def validate_username(self, value):
    if value == 'root':
      raise serializers.ValidationError('不能创建root管理员账号')
    return value
 
  # 定义多字段验证方法
  def validate(self, attrs):
    print(attrs)
    if attrs.get("username") == 'admin':
      raise serializers.ValidationError('不能创建admin用户')
    return attrs
 
1.3 在 user/views.py 中添加视图函数
 
from user.serializers import UserInfoSerializer
 
class UserInfoViewSet(APIView):
 
  # 查询用户信息
  def get(self, request, *args, **kwargs):
    # 一对多、多对多查询都是一样的语法
    obj = User.objects.all()
    ser = UserInfoSerializer(instance=obj,many=True) # 关联数据多个
    # ser = UserInfoSerializer(instance=obj[0]) # 关联数据一个
    return Response(ser.data, status=200)
 
  # 创建用户
  '''创建用户'''
  def post(self,request):
    ser = UserInfoSerializer(data=request.data)
    # 判断提交数据是否合法
    if ser.is_valid():
      ser.save()
      return Response(data=ser.data, status=201)
    return Response(data=ser.errors,status=400)
 
  # 更新用户信息
  def put(self, request):
    pk = request.query_params.get('pk')
    try:
      userinfo = User.objects.get(id = pk)
    except Exception as e:
      return Response(data='用户不存在', status=201)
    # 创建序列化对象,并将要反序列化的数据传递给data构造参数,进而进行验证
    ser = UserInfoSerializer(userinfo,data=request.data)
    if ser.is_valid():
      ser.save()
      return Response(data=ser.data, status=201)
  return Response(data=ser.errors,status=400)
 
2.序列化正向反相查询
 
https://www.cnblogs.com/xiaonq/p/10987889.html#i3
 
3.测试接口
 
3.1 查询所有用户
 
http://192.168.56.100:8888/user/apiview/
 

3.2 创建用户
 
http://192.168.56.100:8888/user/apiview/
 

3.3 更新用户信息
 
http://192.168.56.100:8888/user/apiview/?pk=7

3.4 限流功能测试
 
http://192.168.56.100:8888/user/apiview/
'''修改syl/settings.py配置限速设置'''
REST_FRAMEWORK = {
  #3.1 限流策略
  'DEFAULT_THROTTLE_RATES': {
    'user': '3/hour', # 认证用户每小时10次
    'anon': '3/day',
  },
}

APIview + Serializers的更多相关文章

  1. rest-framework之APIView 序列化组件

    rest-framework之APIView 一 安装djangorestframework 方式一:pip3 install djangorestframework 方式二:pycharm图形化界面 ...

  2. CBV源码分析+APIVIew源码分析

    {drf,resful,apiview,序列化组件,视图组件,认证组件,权限组件,频率组件,解析器,分页器,响应器,URL控制器,版本控制} 一.CBV源码分析准备工作: 新建一个Django项目 写 ...

  3. Django通用视图APIView和视图集ViewSet的介绍和使用

    原 Django通用视图APIView和视图集ViewSet的介绍和使用 2018年10月21日 14:42:14 不睡觉假扮古尔丹 阅读数:630   1.APIView DRF框架的视图的基类是 ...

  4. mixins,generics(ApiView)

    #生成序列化对象class BookModelSerizter(serializers.ModelSerializer): class Meta: model=Book fields='__all__ ...

  5. ModelSerializer序列化(Apiview)

    url部分: url(r'^book/$',views.book.as_view()),url(r'^books/(\d+)/$', views.bookdetail.as_view(),name=' ...

  6. Serializers 序列化组件

    Serializers 序列化组件   为什么要用序列化组件 当我们做前后端分离的项目~~我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 那么我们给前端数据的时候都要转 ...

  7. DRF框架之 serializers 序列化组件

    1. 什么是序列化,其实在python中我们就学了序列化工具json工具,就是吧信息存为类字典形式 2. DRF框架自带序列化的工具: serializers 3. DRF框架 serializers ...

  8. drf3 Serializers 序列化组件

    为什么要用序列化组件 做前后端分离的项目,我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 给前端数据的时候都要转成json格式,那就需要对从数据库拿到的数据进行序列化. ...

  9. django restframework Serializers

    序列化器允许将诸如查询集和模型实例之类的复杂数据转换为原生 Python 数据类型,然后可以将它们轻松地呈现为 JSON,XML 或其他内容类型.序列化器还提供反序列化,在首次验证传入数据之后,可以将 ...

随机推荐

  1. Mongodb PHP封装类

    分享一个Mongodb PHP封装类 <?php /** * Mongodb 基本操作API,支持基本类似关系统型数据库的操作接口 * * @version 1.0 * [说明] * * 1:该 ...

  2. @DependsOn注解的使用

    如果Bean A 在创建前需要先创建BeanB此时就可以使用DependsOn注解 @Configuration public class MyConfig { @Bean @DependsOn(&q ...

  3. 修改默认配置文件.android.gradle.androidstudio到其他目录

    .android 这个文件夹主要是用来存放模拟器的,是占用空间最大的一个,如果你没有使用它的模拟器,可以直接把这个文件夹删除.因为我建立了两个x86的模拟器,吃掉了我20G的空间.果断搬走. 复制当前 ...

  4. P2947 Look Up S

    题目描述: 约翰的N(1≤N≤10^5)头奶牛站成一排,奶牛i的身高是Hi(l≤Hi≤1,000,000).现在,每只奶牛都在向右看齐.对于奶牛i,如果奶牛j满足i<j且Hi<Hj,我们可 ...

  5. 【Hadoop】伪分布式安装

    创建hadoop用户 创建用户命令: sudo useradd -m hadoop -s /bin/bash 创建好后需要更改hadoop用户的密码,命令如下: sudo passwd hadoop ...

  6. 012 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 06 浮点型“字面值”

    012 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 06 浮点型"字面值" 浮点型字面值 首先要知道一点:在整型部分中,默认情况下,即整型数 ...

  7. Pock 把 Touch Bar 变成系统中的 Dock 栏

    Pock 把 Touch Bar 变成系统中的 Dock 栏 Pock 是一款 macOS App,你可以通过它把 Touch Bar 变成系统中的 Dock 栏,直接用来切换和启动 App,尽享全屏 ...

  8. GAN网络之入门教程(四)之基于DCGAN动漫头像生成

    目录 使用前准备 数据集 定义参数 构建网络 构建G网络 构建D网络 构建GAN网络 关于GAN的小trick 训练 总结 参考 这一篇博客以代码为主,主要是来介绍如果使用keras构建一个DCGAN ...

  9. Ubuntu18.04下Git安装及使用

    Ubuntu 18.04 git安装配置及基本使用 git Ubuntu 准备 对Ubuntu相关资源升级 1. linux资源升级 sudo apt-get update 2. linux软件升级 ...

  10. JVM系列【3】Class文件加载过程

    JVM系列笔记目录 虚拟机的基础概念 class文件结构 class文件加载过程 jvm内存模型 JVM常用指令 GC与调优 Class文件加载过程 JVM加载Class文件主要分3个过程:Loadi ...