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

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

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

      django restframework框架五 序列化

      @(python之路)[django restframework框架五 序列化]
      django restframework框架五 序列化

      簡介

      ?當我們做前后端分離得時候,我們需要把后端的時間傳遞給前端,這是就需要Json格式。當然也不否認有其它得格式,例如:xml。但是現在較為普遍得是Json。

      序列化組件

      我們首先建表,然后通過查詢模擬發送數據給前端。
      models.py

      class Sa(models.Model):
          name = models.CharField(max_length=32)
      
      class Host(models.Model):
          hostname = models.CharField(max_length=32)
          port = models.IntegerField(default=80)
      
          host_types = (
              (1,'web'),
              (2,'存儲'),
          )
          htype = models.IntegerField(choices=host_types,default=1)
      
          sa = models.ForeignKey('Sa')
          departs = models.ManyToManyField('Depart')
      
      class Depart(models.Model):
          title = models.CharField(max_length=32)
      

      views.py

      from rest_framework import serializers
      from  rest_framework.response import Response
      
      
      
      class HostSerializer(serializers.Serializer):
          hostname = serializers.CharField()
          port = serializers.IntegerField()
          sa_id = serializers.CharField(source='sa.id')
          sa_name = serializers.CharField(source='sa.name')
          htype_id = serializers.CharField(source='htype')
          htype_title = serializers.CharField(source='get_htype_display')
      
          
          # 這里執行SerializerMethodField,他就會調用get_%s并執行。根據源碼分析。
          departs = serializers.SerializerMethodField()
      
          def get_departs(self,obj):         # obj就是當前數據行的對象
              return [{'id':row.id,'title':row.title} for row in obj.departs.all()]
      
      
      class HostView(APIView):
          authentication_classes = []
      
          def get(self,request,*args,**kwargs):
      
              ret = {'code':2001}
              try:
                  queryset = models.Host.objects.all()
                  ser = HostSerializer(instance=queryset,many=True)    # many只有一個對象用False,如果是queryset多個對象就要many=True
                  ret['data'] = ser.data
              except Exception as e:
                  ret['code'] = 2002
                  ret['msg'] = '獲取數據失敗'
              return Response(ret)
      

      部分截圖

      第二版本

      models.py

      class Sa(models.Model):
          name = models.CharField(max_length=32)
      
      class Host(models.Model):
          hostname = models.CharField(max_length=32)
          port = models.IntegerField(default=80)
      
          host_types = (
              (1,'web'),
              (2,'存儲'),
          )
          htype = models.IntegerField(choices=host_types,default=1)
      
          sa = models.ForeignKey('Sa')
          departs = models.ManyToManyField('Depart')
      
      class Depart(models.Model):
          title = models.CharField(max_length=32)
      

      views.py

      class NewSerializer(serializers.ModelSerializer):
          htype_title = serializers.CharField(source="get_htype_display")
          departs = serializers.SerializerMethodField()
          class Meta:
              model = models.Host
              # fields = '__all__'
              fields = ['hostname','port','htype','htype_title','sa','departs',"departs"]
              depth = 1
          def get_departs(self,obj):
              return [ {"id":row.id,"title":row.title} for row in obj.departs.all()]
      
      class HostView(APIView):
          authentication_classes = []
      
          def get(self,request,*args,**kwargs):
      
              ret = {'code':2001}
              try:
                  queryset = models.Host.objects.all()
                  ser = NewSerializer(instance=queryset,many=True)
                  ret['data'] = ser.data
              except Exception as e:
                  ret['code'] = 2002
                  ret['msg'] = '獲取數據失敗'
              return Response(ret)
      

      序列化與認證

      ?序列化用于對用戶請求數據進行驗證和數據進行序列化。
      自定義字段

      #!/usr/bin/env python
      # -*- coding:utf-8 -*-
      from rest_framework.views import APIView
      from rest_framework.response import Response
      from rest_framework import serializers
      from .. import models
      
      
      class PasswordValidator(object):
          def __init__(self, base):
              self.base = base
      
          def __call__(self, value):
              if value != self.base:
                  message = 'This field must be %s.' % self.base
                  raise serializers.ValidationError(message)
      
          def set_context(self, serializer_field):
              """
              This hook is called by the serializer instance,
              prior to the validation call being made.
              """
              # 執行驗證之前調用,serializer_fields是當前字段對象
              pass
      
      
      class UserSerializer(serializers.Serializer):
          ut_title = serializers.CharField(source='ut.title')
          user = serializers.CharField(min_length=6)
          pwd = serializers.CharField(error_messages={'required': '密碼不能為空'}, validators=[PasswordValidator('666')])
      
      
      class TestView(APIView):
          def get(self, request, *args, **kwargs):
      
              # 序列化,將數據庫查詢字段序列化為字典
              data_list = models.UserInfo.objects.all()
              ser = UserSerializer(instance=data_list, many=True)
              # 或
              # obj = models.UserInfo.objects.all().first()
              # ser = UserSerializer(instance=obj, many=False)
              return Response(ser.data)
      
          def post(self, request, *args, **kwargs):
              # 驗證,對請求發來的數據進行驗證
              ser = UserSerializer(data=request.data)
              if ser.is_valid():
                  print(ser.validated_data)
              else:
                  print(ser.errors)
      
              return Response('POST請求,響應內容')
      
      views.py
      
      

      基于Model自動生成字段

      urls.py

      from django.conf.urls import url, include
      from web.views.s6_serializers import TestView
      
      urlpatterns = [
          url(r'test/', TestView.as_view(), name='test'),
      ]
      

      views.py

      #!/usr/bin/env python
      # -*- coding:utf-8 -*-
      from rest_framework.views import APIView
      from rest_framework.response import Response
      from rest_framework import serializers
      from .. import models
      
      
      class PasswordValidator(object):
          def __init__(self, base):
              self.base = str(base)
      
          def __call__(self, value):
              if value != self.base:
                  message = 'This field must be %s.' % self.base
                  raise serializers.ValidationError(message)
      
          def set_context(self, serializer_field):
              """
              This hook is called by the serializer instance,
              prior to the validation call being made.
              """
              # 執行驗證之前調用,serializer_fields是當前字段對象
              pass
      
      class ModelUserSerializer(serializers.ModelSerializer):
      
          user = serializers.CharField(max_length=32)
      
          class Meta:
              model = models.UserInfo
              fields = "__all__"
              # fields = ['user', 'pwd', 'ut']
              depth = 2
              extra_kwargs = {'user': {'min_length': 6}, 'pwd': {'validators': [PasswordValidator(666), ]}}
              # read_only_fields = ['user']
      
      
      class TestView(APIView):
          def get(self, request, *args, **kwargs):
      
              # 序列化,將數據庫查詢字段序列化為字典
              data_list = models.UserInfo.objects.all()
              ser = ModelUserSerializer(instance=data_list, many=True)
              # 或
              # obj = models.UserInfo.objects.all().first()
              # ser = UserSerializer(instance=obj, many=False)
              return Response(ser.data)
      
          def post(self, request, *args, **kwargs):
              # 驗證,對請求發來的數據進行驗證
              print(request.data)
              ser = ModelUserSerializer(data=request.data)
              if ser.is_valid():
                  print(ser.validated_data)
              else:
                  print(ser.errors)
      
              return Response('POST請求,響應內容')
      
      
      

      生成URL

      urls.py

      from django.conf.urls import url, include
      from web.views.s6_serializers import TestView
      
      urlpatterns = [
          url(r'test/', TestView.as_view(), name='test'),
          url(r'detail/(?P<pk>\d+)/', TestView.as_view(), name='detail'),
      ]
      

      views.py

      #!/usr/bin/env python
      # -*- coding:utf-8 -*-
      from rest_framework.views import APIView
      from rest_framework.response import Response
      from rest_framework import serializers
      from .. import models
      
      
      class PasswordValidator(object):
          def __init__(self, base):
              self.base = str(base)
      
          def __call__(self, value):
              if value != self.base:
                  message = 'This field must be %s.' % self.base
                  raise serializers.ValidationError(message)
      
          def set_context(self, serializer_field):
              """
              This hook is called by the serializer instance,
              prior to the validation call being made.
              """
              # 執行驗證之前調用,serializer_fields是當前字段對象
              pass
      
      
      class ModelUserSerializer(serializers.ModelSerializer):
          ut = serializers.HyperlinkedIdentityField(view_name='detail')
          class Meta:
              model = models.UserInfo
              fields = "__all__"
      
              extra_kwargs = {
                  'user': {'min_length': 6},
                  'pwd': {'validators': [PasswordValidator(666),]},
              }
      
      
      
      class TestView(APIView):
          def get(self, request, *args, **kwargs):
      
              # 序列化,將數據庫查詢字段序列化為字典
              data_list = models.UserInfo.objects.all()
              ser = ModelUserSerializer(instance=data_list, many=True, context={'request': request})
              # 或
              # obj = models.UserInfo.objects.all().first()
              # ser = UserSerializer(instance=obj, many=False)
              return Response(ser.data)
      
          def post(self, request, *args, **kwargs):
              # 驗證,對請求發來的數據進行驗證
              print(request.data)
              ser = ModelUserSerializer(data=request.data)
              if ser.is_valid():
                  print(ser.validated_data)
              else:
                  print(ser.errors)
      
              return Response('POST請求,響應內容')
      

      自動生成URL

      urls.py

      from django.conf.urls import url, include
      from web.views.s6_serializers import TestView
      
      urlpatterns = [
          url(r'test/', TestView.as_view(), name='test'),
          url(r'detail/(?P<pk>\d+)/', TestView.as_view(), name='xxxx'),
      ]
      

      views.py

      #!/usr/bin/env python
      # -*- coding:utf-8 -*-
      from rest_framework.views import APIView
      from rest_framework.response import Response
      from rest_framework import serializers
      from .. import models
      
      
      class PasswordValidator(object):
          def __init__(self, base):
              self.base = str(base)
      
          def __call__(self, value):
              if value != self.base:
                  message = 'This field must be %s.' % self.base
                  raise serializers.ValidationError(message)
      
          def set_context(self, serializer_field):
              """
              This hook is called by the serializer instance,
              prior to the validation call being made.
              """
              # 執行驗證之前調用,serializer_fields是當前字段對象
              pass
      
      
      class ModelUserSerializer(serializers.HyperlinkedModelSerializer):
          ll = serializers.HyperlinkedIdentityField(view_name='xxxx')
          tt = serializers.CharField(required=False)
      
          class Meta:
              model = models.UserInfo
              fields = "__all__"
              list_serializer_class = serializers.ListSerializer
      
              extra_kwargs = {
                  'user': {'min_length': 6},
                  'pwd': {'validators': [PasswordValidator(666), ]},
                  'url': {'view_name': 'xxxx'},
                  'ut': {'view_name': 'xxxx'},
              }
      
      
      class TestView(APIView):
          def get(self, request, *args, **kwargs):
              # # 序列化,將數據庫查詢字段序列化為字典
              data_list = models.UserInfo.objects.all()
              ser = ModelUserSerializer(instance=data_list, many=True, context={'request': request})
              # # 如果Many=True
              # # 或
              # # obj = models.UserInfo.objects.all().first()
              # # ser = UserSerializer(instance=obj, many=False)
              return Response(ser.data)
      
          def post(self, request, *args, **kwargs):
              # 驗證,對請求發來的數據進行驗證
              print(request.data)
              ser = ModelUserSerializer(data=request.data)
              if ser.is_valid():
                  print(ser.validated_data)
              else:
                  print(ser.errors)
      
              return Response('POST請求,響應內容')
      
      posted @ 2019-03-15 16:10  zz小公子  閱讀(149)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 偷拍一区二区三区在线视频| 99久久成人亚洲精品观看| 中文无码vr最新无码av专区| 青草精品国产福利在线视频| 熟女人妻aⅴ一区二区三区电影| 国产精品69人妻我爱绿帽子| 国产目拍亚洲精品区一区| 久久国产免费观看精品3| 国产精品爱久久久久久久| 男女裸交免费无遮挡全过程| 97欧美精品系列一区二区| 国产一区二区三区免费观看| 在线天堂最新版资源| 日本真人做爰免费视频120秒| 午夜福利影院不卡影院| 国产精品制服丝袜无码| 亚洲欧美精品aaaaaa片| 色8久久人人97超碰香蕉987| 国产精品中文第一字幕| 龙里县| 香港特级三A毛片免费观看| 日韩中文字幕人妻精品| 国产成人无码网站| 大田县| 国产精品国产三级国产专| 亚洲人成小说网站色在线| 欧美另类精品xxxx人妖| 无码中文字幕热热久久| 99久久国产一区二区三区| 国产成人高清精品亚洲| 成年女人免费碰碰视频| 色噜噜一区二区三区| 动漫av网站免费观看| 97亚洲色欲色欲综合网| 中文字幕一区二区三区麻豆| 国产91成人亚洲综合在线| 亚洲性av网站| 免费视频一区二区三区亚洲激情| 石家庄市| 国产精品制服丝袜无码| 国产成人精品无码播放|