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. 大话Python切片,助你彻底掌控切片小妖精

    切片语义 生活中切黄瓜.切萝卜.一本书的每一页等等都是符合切片的语义 切片的语义是从某个东西中通过某种手段拿到某个整体的一部分 切片是拿来主义,建立在已经有的序列上,有黄瓜才能切黄瓜  列表 -> ...

  2. (数据科学学习手札96)在geopandas中叠加在线地图

    本文示例文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 国庆期间,抽空给大家分享在geopandas中叠 ...

  3. unity 3d 三、空间与运动

    3D游戏编程第三次作业 简答并用程序验证[建议做] 游戏对象运动的本质是什么? 游戏对象运动的本质是游戏对象Position.Rotate.Scale属性数值的变化. 请用三种方法以上方法,实现物体的 ...

  4. SpringBoot-05-web开发

    5. SpringBoot Web开发 5.1 web开发探究 简介 SpringBoot最大的特点就是自动装配! 使用SpringBoot的步骤: 创建一个SpringBoot应用,选择我们需要的模 ...

  5. 【Java】socket编程,输入输出中的问题

    BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWri ...

  6. pytorch和tensorflow的爱恨情仇之张量

    pytorch和tensorflow的爱恨情仇之基本数据类型:https://www.cnblogs.com/xiximayou/p/13759451.html pytorch版本:1.6.0 ten ...

  7. #error: Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d]

    转载:https://www.cnblogs.com/cvwyh/p/10570920.html 错误 在使用VS编译文件时出现了如下错误: #error: Building MFC applicat ...

  8. Win10系统中文显示乱码怎么解决

    来源:https://jingyan.baidu.com/article/d8072ac4ba20cfec94cefd48.html 简单的说是: 全部设置改为中国而且一定要重启系统,无论时间还是区域 ...

  9. Batch批处理 间断向EXE发送参数

    参考:https://blog.csdn.net/wjz1029/article/details/45044033 找了很久的一种方法: 怎样向一个EXE 发送一个参数,得到反馈后,再向EXE发送一个 ...

  10. Javascript判断数据类型的五种方式及其特殊性

    Javascript判断数据类型的五种方式及区别 @ 目录 typeof instanceof Object.prototype.toString isArray iisNaN ----------- ...