<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Loading

      django--restframework 序列化

      1.djangorestframework 序列化


      1.1序列化常用字段參數

      • 選項參數

        name = serializers.CharField(min_length=3,max_length=20)
        max_length     # 最大長度
        min_lenght     # 最小長度
        allow_blank    # 是否允許為空
        max_value      # 最大值
        min_value      # 最小值 
        
      • 通用參數

        gp = serializers.SerializerMethodField(read_only=True) 
        read_only     # 表明該字段僅用于序列化輸出,默認False
        write_only    # 表明該字段僅用于反序列化輸入,默認False
        required      # 表明該字段在反序列化時必須輸入,默認True
        default       # 反序列化時使用的默認值
        allow_null    # 表明該字段是否允許傳入None,默認False
        validators    # 該字段使用的驗證器
        label         # 用于HTML展示API頁面時,顯示的字段名稱
        help_text     # 用于HTML展示API頁面時,顯示的字段幫助提示信息
        error_messages    # 包含錯誤編號與錯誤信息的字典
        

      2.序列化使用( serializers.Serializer )


      1)序列化(正向查找)

      from rest_framework import serializers
      from users.models import UserInfo
      
      class UserInfoSerializer(serializers.Serializer):
          name = serializers.CharField(min_length=3,max_length=20)               # 顯示普通字段
          ut = serializers.CharField(source='ut.type_name',required=False)       # 顯示一對多字段名稱 **一對多字段需要寫source='字段名.表名',required=False***
          gp = serializers.SerializerMethodField(read_only=True)                 # 自定義顯示(顯示多對多)
          xxx = serializers.CharField(source='name',required=False)              # 也可以自定義顯示字段名稱
          ut_id = serializers.IntegerField(write_only=True)                      # 一對多關聯字段定義(外鍵約束)
      
          '''PrimaryKeyRelatedField和StringRelatedField:可以用對 一對多 和 多對多 關聯對象序列化'''
          # gp = serializers.PrimaryKeyRelatedField(read_only=True, many=True)
          # gp = serializers.StringRelatedField(read_only=True,many=True)
      
          class Meta:
              model = UserInfo
      
          # 自定義顯示 多對多 字段    **自定義字段需要寫這個**
          def get_gp(self,row):
              '''row: 傳過來的正是 UserInfo表的對象'''
              gp_obj_list = row.gp.all().values('id','group')  # 獲取用戶所有組
              return gp_obj_list
      

      2)序列化(反向查找)

      ''' 一對多序列化(反向查找)'''
      class UserTypeSerializer(serializers.Serializer):
          type_name = serializers.CharField()
          # 方法1一對多關聯對象序列化:此字段將被序列化為關聯對象的主鍵
          userinfo_set = serializers.PrimaryKeyRelatedField(read_only=True, many=True)
      
          # 方法2一對多關聯對象序列化:此字段將被序列化為關聯對象的字符串表示方式(即__str__方法的返回值)
          # userinfo_set = serializers.StringRelatedField(read_only=True,many=True)
          # 方法3一對多關聯對象序列化:使用關聯對象的序列化器
          # userinfo_set = UserInfoSerializer(many=True)
      

      3)視圖函數中使用序列化

      class UserInfoViewSet(APIView):
          def get(self, request, *args, **kwargs):
              # 一對多、多對多查詢都是一樣的語法
              obj = users_model.UserInfo.objects.all()
              ser = serializers.UserInfoSerializer(instance=obj,many=True)  # 關聯數據多條
              # ser = serializers.UserInfoSerializer(instance=obj[0])       # 關聯數據一條
              return Response(ser.data, status=200)
      

      3、反序列化


      1)使用反序列化保存數據

      '''創建用戶'''
      def post(self,request):
          ser = serializers.UserInfoSerializer(data=request.data)
          if ser.is_valid():
              ser.save()
              return Response(data=ser.data, status=201)
          return Response(data=ser.errors,status=400)
      

      2)反序列化定義創建和更新方法

      # 定義創建語法
          def create(self, validated_data):
              return UserInfo.objects.create(**validated_data)
      
          # 定義更新方法
          def update(self, instance, validated_data):
              if validated_data.get('name'):
                  instance.name = validated_data['name']
              if validated_data.get('ut_id'):
                  instance.ut_id = validated_data['ut_id']
              instance.save()
              return instance
      
          # 定義單一字段驗證的方法
          def validate_name(self, value):
              if value == 'root':
                  raise serializers.ValidationError('不能創建root管理員賬號')
              return value
      
          # 定義多字段驗證方法
          def validate(self, attrs):
              if attrs['name'] == 'admin':
                  raise serializers.ValidationError('不能創建admin用戶')
              return attrs
      

      4、序列化使用舉例(serializers.ModelSerializer)


      1. ModelSerializer本質是繼承了Serielizer類添加了部分功能

      2. 在使用上ModelSerializer可以使用 fields = 'all' 定義要顯示的字段

      serializers.ModelSerializer使用

      '''users/serializers/userinfo_serializers.py'''
      
      from rest_framework import serializers
      from users.models import UserInfo
      
      class UserInfoSerializer(serializers.ModelSerializer):
          # name = serializers.CharField()                       # 顯示普通字段
          ut = serializers.CharField(source='ut.type_name')     # 顯示一對多字段
          gp = serializers.SerializerMethodField()               # 自定義顯示(顯示多對多)
          xxx = serializers.CharField(source='name')             # 也可以自定義顯示字段名稱
      
          class Meta:
              model = UserInfo
              # fields = "__all__"
              fields = ["name",'ut','gp','xxx']  # 定義顯示那些字段
      
          def get_gp(self,row):
              '''row: 傳過來的正是 UserInfo表的對象'''
              gp_obj_list = row.gp.all()  # 獲取用戶所有組
              ret = []
              for item in gp_obj_list:
                  ret.append({'id':item.id,'gp':item.group})
              return ret
      
      
      

      5、使用serializers.ModelSerializer 進行數據驗證


      users/views.py

      
      from rest_framework.views import APIView
      from users.serializers.userinfo_serializers import UserInfoSerializer
      from users.models import UserInfo
      
      class UserInfoViewSet(APIView):
          def get(self, request, *args, **kwargs):
              obj = UserInfo.objects.all()
              ser = UserInfoSerializer(instance=obj,many=True)
              ret = json.dumps(ser.data,ensure_ascii=False)
              return HttpResponse(ret)
      
          def post(self, request, *args, **kwargs):
              ser = UserInfoSerializer(data=request.data)          # 驗證,對請求發來的數據進行驗證
              if ser.is_valid():
                  print(ser.validated_data)  # post請求數據字典
              else:
                  print(ser.errors)  # form驗證錯誤信息
              return HttpResponse(json.dumps({'status':True}))
      
      
      

      users/serializers/userinfo_serializers.py

      '''users/serializers/userinfo_serializers.py'''
      
      from rest_framework import serializers
      from django.core.exceptions import ValidationError
      from users.models import UserInfo
      
      class UserInfoSerializer(serializers.ModelSerializer):
          name = serializers.CharField(min_length=10, error_messages={'required': '該字段必填'})                       # 顯示普通字段
          ut = serializers.CharField(source='ut.type_name',required=False)     # 顯示一對多字段
          gp = serializers.SerializerMethodField(required=False)               # 自定義顯示(顯示多對多)
          xxx = serializers.CharField(source='name', required=False)             # 也可以自定義顯示字段名稱
      
          class Meta:
              model = UserInfo
              # fields = "__all__"
              fields = ["name",'ut','gp','xxx']  # 定義顯示那些字段
      
          # 局部鉤子:
          def validate_name(self, value):  # value 是name字段提交的值
              if value.startswith('sb'):  # 不能以sb開頭
                  raise ValidationError('不能以sb開頭')
              else:
                  return value
      
          # 全局鉤子找到了
          def validate(self, value):  # value是所有校驗通過數據的字典
              name = value.get('name')
              if False:
                  raise ValidationError('全局鉤子引發異常')
              return value
      
      
      
      '''1、ser.is_valid()'''
      # 驗證post請求中數據是否合法
      
      '''2、全局校驗鉤子'''
      def validate(self, value):        # value是所有校驗通過數據的字典
      
      '''3、局部鉤子'''
      def validate_name(self, value):   # value 是name字段提交的值
      
      posted @ 2020-10-12 21:10  就學45分鐘  閱讀(158)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 免费国产黄线在线观看| 国产三级黄色片在线观看| 国产精品午夜福利资源| 真人抽搐一进一出视频| av无码精品一区二区乱子| 国产成人AV男人的天堂| 2021AV在线无码最新| 人妻熟女一区二区aⅴ向井蓝| 亚洲精品乱码久久久久久按摩高清| 亚洲色在线v中文字幕| 欧美www在线观看| 和平区| 国产熟女一区二区三区四区| 一亚洲一区二区中文字幕| 国产成人精品无码一区二区老年人| 亚洲日韩精品无码一区二区三区| 一区二区三区午夜无码视频| 常宁市| av中文字幕一区人妻| 中文字幕日韩有码一区| 豆国产97在线 | 亚洲| 亚洲AV日韩AV激情亚洲| 九九色这里只有精品国产| 忘忧草在线社区www中国中文| 中文国产成人精品久久不卡| 日本夜爽爽一区二区三区| av在线播放国产一区| 精品乱码一区二区三四五区| 长腿校花无力呻吟娇喘的视频| 国产成人精品一区二区无| 免费久久人人爽人人爽AV| 亚洲第一香蕉视频啪啪爽| 久久精品国产亚洲av亚| 99人体免费视频| 毛片内射久久久一区| 蜜臀av一区二区国产精品| 国产精品99一区二区三区| av在线播放观看国产| 国内熟妇人妻色在线视频| 国产乱码1卡二卡3卡四卡5 | 国产中文字幕日韩精品|