zoukankan      html  css  js  c++  java
  • 序列化

    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)
    

    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)
    
    class Meta:
    model = User
    

    定义创建语法: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 : 查询的对象
    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',
    },
    }
    

    2.序列化ModelSelializer,最常用也最简单

    from rest_framework import serializers
    from .models import *
    class ModelNameSerializer(serializers.ModelSerializer):
        class Meta:
            model = modelname  #指定要序列化的名
            fields = '__all__'  #指定要序列化的字段名,也可单或多个字段,all代表全部
            depth = 1  #指定关联的表的深度
    
  • 相关阅读:
    bzoj1045: [HAOI2008] 糖果传递(数论)
    bzoj1083: [SCOI2005]繁忙的都市(最小生成树)
    bzoj1079: [SCOI2008]着色方案(DP)
    BZOJ2467 [中山市选2010]生成树
    BZOJ4766 文艺计算姬
    BZOJ4894 天赋
    BZOJ2560 串珠子
    [SDOI2014]重建
    BZOJ3622 已经没有什么好害怕的了
    [SDOI2016]储能表
  • 原文地址:https://www.cnblogs.com/my-soul-my-heart/p/13887862.html
Copyright © 2011-2022 走看看