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. helm部署mysql

    如果您的kubernetes已有了helm,那么部署mysql的步骤可以进一步简化,那些原先需要自己动手配置的deployment和service都已集成在chart中,今天就来实战通过helm部署m ...

  2. shiro入门学习--授权(Authorization)|筑基初期

    写在前面 经过前面的学习,我们了解了shiro中的认证流程,并且学会了如何通过自定义Realm实现应用程序的用户认证.在这篇文章当中,我们将学习shiro中的授权流程. 授权概述 这里的授权指的是授予 ...

  3. spring-boot-route(十二)整合redis做为缓存

    redis简介 redis作为一种非关系型数据库,读写非常快,应用十分广泛,它采用key-value的形式存储数据,value常用的五大数据类型有string(字符串),list(链表),set(集合 ...

  4. 返回头添加cookie信息

    返回类型 HttpResponseMessage //构建返回对象 var res= Request.CreateResponse(HttpStstusCode.Ok,返回体) //创建cookie对 ...

  5. 多测师讲解python_os模块_高级讲师肖sir

    #os.path.isfile()#:判断当前是否为文件,返回布尔值是文件则True否者Falsea_path='F:\cms搭建.rar' #lesson包b_path=r'D:\bao\kk '# ...

  6. java基础语句翻译

    public static void main(String[] args) { System.out.println("人生中的第一个代码-----"); } } package ...

  7. MeteoInfoLab脚本示例:Streamline流线图

    绘制Stramline流线图的函数是streamline,需要两个变量(U/V分量或者风向/风速).脚本程序: f = addfile('D:/Temp/GrADS/model.ctl') u = f ...

  8. 机器学习 KNN算法原理

    K近邻(K-nearst neighbors,KNN)是一种基本的机器学习算法,所谓k近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表.比如:判断一个人的人品,只需要观察 ...

  9. MySQL:SELECT COUNT 小结

    MySQL:SELECT COUNT 小结 背景 今天团队在做线下代码评审的时候,发现同学们在代码中出现了select count(1) . select count(*),和具体的select co ...

  10. nginx集群:nginx配置负载均衡集群(nginx1.18.0)

    一,nginx的负载均衡集群的特点: 1,nginx集群和lvs的不同? lvs集群:工作在第4层(传输层) nginx集群:工作在第7层(应用层) lvs集群:性能更强 nginx集群:功能更强:可 ...