Django REST framework 직렬 화 (一) --- - Query Set 직렬 화
직렬 화 는 두 가지 용도 가 있 습 니 다. 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django 라우팅 계층 URLconf 작용 및 원리 해석URL 구성(URLconf)은 Django가 지원하는 웹 사이트의 디렉토리와 같습니다.그것의 본질은 URL과 이 URL을 호출할 보기 함수 사이의 맵표입니다. 위의 예제에서는 URL의 값을 캡처하고 위치 매개 변수로...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.