Django REST framework 직렬 화 (一) --- - Query Set 직렬 화

29252 단어 DjangoRESTframework
해상도 기 는 요청 체 데 이 터 를 분석 하 는 것 입 니 다.
직렬 화 는 두 가지 용도 가 있 습 니 다. 1. Query Set 을 직렬 화 (json 은 Query Set 형식 을 직렬 화 할 수 없습니다) 2. 요청 데 이 터 를 검증 합 니 다.
Django 도 Query Set 을 직렬 화 하 는 방법 을 가지 고 왔 습 니 다.
지금 보기 REST framework 의 직렬 화:
기본 사용 (Query Set 직렬 화)
제1 종 실현 방식
1. 일반 데이터베이스 \ # 데이터베이스

class Role(models.Model):
    title=models.CharField(max_length=32)

\ # 보기
import json
from rest_framework import serializers
class Roleserializer(serializers.Serializer):
    '''    '''
    id =serializers.IntegerField()
    title=serializers.CharField()                   #   ,  id title,       。                  

class RoleView(APIView):
    def get(self,request):
        roles=Role.object.all()   #      ,  QuerySet
        ser=Roleserializer(instance=roles,many=True)   # QuerySet     ,many=Ture       
        ret=json.dumps(ser.data,ensure_ascii=False)    #   ser.data,ensure_ascii=False    
		'''ser   json   , json.dumps      '''


        return HttpResponse(ret)         #     
        #[{"id":1,"title":"  "},{"id":2,"title":"  }]
        '''
        role = Role.object.all().first()  #           ,  QuerySet
        ser = Roleserializer(instance=role, many=False)  #  QuerySet     ,many=Fasle      
        ret = json.dumps(ser.data, ensure_ascii=False)  #    ser.data,ensure_ascii=False    
        return HttpResponse(ret)  #      
        '''

둘째, 실행 가능 한 필드 가 있 는 데이터베이스 \ # 데이터베이스 테이블
class Role(models.Model):
    title=models.CharField(max_length=32)
class UserGrope(models.Model):
    title = models.CharField(max_length=32)
class UserInfo(models.Model):
    user_type_choices=(
        (1,'    '),
        (2,'VIP'),
        (3,'SVIP')
    )
    user_type=models.IntegerField(choices=user_type_choices)
    role=models.ForeignKey(Role)
    group=models.ManyToManyField('UserGrope')

\ # 보기
#    
class UserInfoserializer(serializers.Serializer):
    # usr_type=serializers.CharField(source='user_type')   #source='user_type'          ,   source,       ,     
    #        
    usr_type = serializers.CharField(source='get_user_type_dispaly')  #        
    role=serializers.CharField(source='role.title')               #         
    #group=serializers.CharField(source='group.all')               #       
    group=serializers.SerializerMethodField(source='group.all') #        ,    ,             
    def get_group(self,row):
        group_obj_list=row.group.all()
        ret=[]
        for item in group_obj_list:
            ret.append({"id":item.id,"title":item.title})
        return ret
#   
class UserView(APIView):
    def get(self,request):
        roles=UserInfo.object.all()   #      ,  QuerySet
        ser=UserInfoserializer(instance=roles,many=True)   # QuerySet     ,many=Ture       
        ret=json.dumps(ser.data,ensure_ascii=False)    #   ser.data,ensure_ascii=False    
		'''ser   json   , json.dumps      '''
        return HttpResponse(ret)         #     


두 번 째 실현 방식 (가장 자주 사용)
\ # 직렬 화 클래스
from rest_framework import serializers
class UserInfoserializer(serializers.ModelSerializer):
    class Meta:
        model=UserInfo          #     
        #fields="_all_"         #           ,          ,          

        user_type=serializers.CharField(source='get_user_type_dispaly')
        role = serializers.CharField(source='role.title')
        group = serializers.SerializerMethodField(source='group.all')  #     
        fields=['id','user_type','role','group']
    def get_group(self,row):                       #     ,             
        group_obj_list=row.all()
        ret=[]
        for item in group_obj_list:
            ret.append({"id":item.id,"title":item.title})
        return ret
#   
class UserView(APIView):
    def get(self,request):
        roles=UserInfo.object.all()   #      ,  QuerySet
        ser=UserInfoserializer(instance=roles,many=True)   # QuerySet     ,many=Ture       
        ret=json.dumps(ser.data,ensure_ascii=False)    #   ser.data,ensure_ascii=False    
		'''ser   json   , json.dumps      '''
        return HttpResponse(ret)         #     

* * * 보충 두 가지 방법 설명: * *: to_internal_value,to_representation
def to_representation(self, obj):
       """   Model       parse   Api"""
       return obj

   def to_internal_value(self, data):
       """        json    parse   Model"""
       return json.loads(data.encode(‘utf-8))

안전 관리자 업무 플랫폼 사용 실례:
1
def mask_value(value):
    return value[:3] + '*' * 4 + value[-4:]
class CTClientProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = CTClient
        fields = ('phone', 'nickname')
        read_only_fields = ('phone',)

    def to_representation(self, instance):            #                    ,                 
        ret = super().to_representation(instance)
        if ret['phone'] is not None:
            ret['phone'] = mask_value(ret['phone'])
        return ret

2
class CTClientThreatActionSerializer(serializers.ModelSerializer):
    class Meta:
        model = CTClient
        fields = ('threat_action_high', 'threat_action_medium', 'threat_action_low')
"
    def to_internal_value(self, data):                #                ,     "high","medium","low"。         ,           ,       。
        data['threat_action_high'] = data['high']
        data['threat_action_medium'] = data['medium']
        data['threat_action_low'] = data['low']
        del data['high']
        del data['medium']
        del data['low']
        return super().to_internal_value(data)

    def to_representation(self, instance):
        ret = super().to_representation(instance)
        ret['high'] = ret['threat_action_high']
        ret['medium'] = ret['threat_action_medium']
        ret['low'] = ret['threat_action_low']
        del ret['threat_action_high']
        del ret['threat_action_medium']
        del ret['threat_action_low']
        return ret

세 번 째 실현 방식:
from rest_framework import serializers
class UserInfoserializer(serializers.ModelSerializer):
    class Meta:
        model=UserInfo          #     
        fields="_all_"         #         ,      
        #fields=['id','user_type','role','group']
        depth=1                #       ,         ,    0——10,   0         

좋은 웹페이지 즐겨찾기