drf 직렬 화기 serializer 의 구체 적 인 사용
15095 단어 drf서열 화기serializer
4.567917.직렬 화,직렬 화 기 는 모델 대상 을 사전 으로 바 꾸 고 response 를 거 친 후에 JSON 문자열 이 됩 니 다4.567917.반 직렬 화:클 라 이언 트 가 보 낸 데 이 터 를 request 를 거 친 후에 사전 으로 바 꾸 고 직렬 화 기 는 사전 을 모델 로 바 꿀 수 있 습 니 다4.567917.반 직렬 화:데이터 검사 기능 완성
2.직렬 화기 의 사용
직렬 화기 의 사용 은 두 단계 로 나 뉜 다.
4.567917.클 라 이언 트 가 요청 할 때 직렬 화 기 를 사용 하면 데이터 에 대한 반 직렬 화 를 완성 할 수 있 습 니 다4.567917.서버 응답 시 직렬 화 기 를 사용 하면 데이터 에 대한 직렬 화 를 완성 할 수 있 습 니 다간단히 사용 하 다
1.표 모형 만 들 기
from django.db import models
class Books(models.Model):
title = models.CharField(verbose_name=' ', max_length=32)
publish = models.CharField(verbose_name=' ', max_length=32)
price = models.DecimalField(verbose_name=' ', max_digits=5, decimal_places=2)
2.py 파일 을 새로 만 들 고 직렬 화 된 클래스 를 작성 하여 Serializer 를 계승 합 니 다.3.클래스 에 정렬 할 필드 를 쓰 고 그 필드 를 정렬 하려 면 클래스 에 그 필드 를 쓰 십시오.
from rest_framework import serializers
class BooksSerializer(serializers.Serializer):
title = serializers.CharField()
publish = serializers.CharField()
price = serializers.DecimalField()
4.보기 류 에서 사용 하고 도입―실례 화 를 통 해 직렬 화 대상 을 얻 고 직렬 화 대상 을 전달한다.5.직렬 화 된 대상.data―는 사전 이다.
6.사전 을 되 돌려 줍 니 다.rest 를 사용 하지 않 으 면framework 가 제공 하 는 Response 는 JSonResponse 를 사용 해 야 합 니 다.
from rest_framework.views import APIView
from rest_framework.request import Request
from app01.models import Books
from app01.ser import BooksSerializer
class BookView(APIView):
def get(self, request, pk):
#
response_msg = {'status': 200, 'message': ' '}
#
book = Books.objects.filter(pk=pk).first()
#
book_ser = BooksSerializer(book)
# book_ser.data――――》 .data――――》
#
response_msg['data'] = book_ser.data
return Response(response_msg)
# urls.py
re_path(r'^book/(?P<pk>\d+)/', views.BookView.as_view()),
7.여러 개의 데 이 터 를 포함 하 는 조회 집합 query set 를 직렬 화 하려 면 many=True 인 자 를 추가 할 수 있 습 니 다.
from rest_framework.views import APIView
from rest_framework.response import Response
from app01.models import Books
from app01.ser import BooksSerializer
class BooksView(APIView):
def get(self, request):
#
response_msg = {'status': 200, 'message': ' '}
books = Books.objects.all()
#
book_ser = BooksSerializer(books, many=True)
# book_ser.data――――》 .data――――》
#
response_msg['data'] = book_ser.data
return Response(response_msg)
# urls.py
re_path(r'^books/', views.BookView.as_view()),
고급 사용source
1、필드 이름 변경 가능
class BooksSerializer(serializers.Serializer):
xxx = serializers.CharField(source='title') # ――》xxx = Books.title
#
{
"status": 200,
"message": " ",
"data": {
"xxx": " " ――――》
}
}
2.타 표 조회 가능
class BookSerializer(serializers.Serializer):
publish_email = serializers.CharField(source='publish.email')
# ――》publish_email = Book.publish.email publish email
#
{
"status": 200,
"message": " ",
"data": {
"publish_email": "[email protected]"
}
}
3.실행 가능 한 방법
# models.py
class Book(models.Model):
title = models.CharField(max_length=32)
price = models.IntegerField()
pub_date = models.DateTimeField()
publish = models.ForeignKey("Publish", on_delete=models.CASCADE, null=True)
authors = models.ManyToManyField("Author")
def func(self):
return '666666'
# ser.py
class BookSerializer(serializers.Serializer):
msg = serializers.CharField(source='func')
# msg = Book.func ――》 Book func()
#
{
"status": 200,
"message": " ",
"data": {
"msg": "666666"
}
}
**SerializerMethodField( ) **get 이 라 고 부 르 는 세트 방법 이 필요 합 니 다.필드 이름,반환 값 은 표시 할 것 입 니 다.
class BookSerializer(serializers.Serializer):
authors = serializers.SerializerMethodField()
def get_authors(self, instance):
# instance ――》 Book
authors = instance.authors.all() #
author_list = []
for author in authors:
author_list.append({'name': author.name, 'age': author.age})
return author_list
공통 매개 변수read_only:(읽 기 전용)이 필드 는 직렬 화 출력 에 만 사 용 됩 니 다.기본 False 입 니 다.True 로 설정 하면 응답 에서 이 필드 를 볼 수 있 습 니 다.수정 할 때 이 필드 를 전송 할 필요 가 없습니다.
write_only:(쓰기 만)이 필드 는 역 직렬 화 입력 에 만 사 용 됩 니 다.기본 False 입 니 다.True 로 설정 하면 응답 에서 이 필드 가 보이 지 않 습 니 다.수정 할 때 이 필드 를 전송 해 야 합 니 다.
from rest_framework import serializers
class BooksSerializer(serializers.Serializer):
title = serializers.CharField(read_only = True) # ,
publish = serializers.CharField(write_only = True) # ,
price = serializers.DecimalField()
그리고 매개 변 수 는 다음 과 같 습 니 다.직렬 화 기 를 사용 하여 데 이 터 를 반 직렬 화 할 때 데 이 터 를 검증 해 야 합 니 다.검사 에 성공 한 데이터 만 모델 류 대상 으로 저장 할 수 있 습 니 다.
검사 할 데 이 터 를 직렬 화기 에 전송 하고 실례 화:obj=BooksSerializer(data=request.data),호출 isvalid()방법 검증,검증 성공 반환 True,실패 반환 False.
실패,직렬 화 대상 의 errors 를 통 해 오류 정보(사전)를 얻 을 수 있 습 니 다.
성공,공공 서열 화 대상 의 validateddata 속성 에서 데 이 터 를 가 져 옵 니 다.
검사 방법 은 부분 갈고리,전역 갈고리,vaidators,직렬 화 유형 과 필드 속성 도 있 습 니 다.
필드 속성
국부 갈고리
직렬 화 클래스 에 부분 갈고리 만 들 기:vaidate필드 이름,그리고 매개 변 수 를 받 습 니 다.
# ser.py
class BooksSerializer(serializers.Serializer):
title = serializers.CharField()
publish = serializers.CharField()
price = serializers.DecimalField(max_digits=5, decimal_places=2)
# price
def validate_price(self, data):
if float(data) > 20:
#
return data
else:
#
raise ValidationError(' ')
전역 갈고리전역 갈고리:vaidate(),매개 변 수 를 받 습 니 다.
동시에 여러 필드 를 비교 검증 합 니 다.
# ser.py
class BooksSerializer(serializers.Serializer):
title = serializers.CharField()
publish = serializers.CharField()
price = serializers.DecimalField(max_digits=5, decimal_places=2)
def validate(self, validate_data):
title = validate_data.get('title')
publish = validate_data.get('publish')
if not title == publish:
return validate_data
else:
raise ValidationError(' ')
validators필드 의 vaidators=[func]를 사용 하여 검사 합 니 다.
# ser.py
#
def check_price(data):
if float(data) > 10:
return data
else:
raise ValidationError(' ')
class BooksSerializer(serializers.Serializer):
title = serializers.CharField()
publish = serializers.CharField()
price = serializers.CharField(validators=[check_price]) #
4.직렬 화 기 조작 데이터모든
# views.py
class BooksView(APIView):
def get(self, request):
#
response_msg = {'status': 200, 'message': ' '}
#
books = Books.objects.all()
#
book_ser = BooksSerializer(instance=books, many=True) # many=True
# book_ser.data――――》 .data――――》
#
response_msg['data'] = book_ser.data
return Response(response_msg)
# urls.py
path('books/', views.BooksView.as_view()),
조회 목록
# views.py
class BookView(APIView):
def get(self, request, pk):
#
response_msg = {'status': 200, 'message': ' '}
#
book = Books.objects.filter(pk=pk).first()
#
book_ser = BooksSerializer(instance=book)
# book_ser.data――――》 .data――――》
#
response_msg['data'] = book_ser.data
return Response(response_msg)
# urls.py
re_path(r'^book/(?P<pk>\d+)/', views.BookView.as_view()),
데이터 추가새로 추 가 된 데 이 터 는 직렬 화 기 에서 create()방법 을 다시 써 야 합 니 다.
인 스 턴 스 인 스 턴 스 를 전달 하지 않 으 면 save()방법 을 호출 할 때 create()가 호출 되 는 반면 인 스 턴 스 인 스 턴 스 를 전달 하면 save()방법 을 호출 할 때 update()가 호출 됩 니 다.
# views.py
class BookView(APIView):
def post(self, request):
#
response_msg = {'status': 201, 'message': ' '}
# instance, instance, data
book_ser = BooksSerializer(data=request.data)
#
if book_ser.is_valid():
book_ser.save() # create()
#
response_msg['data'] = book_ser.data
else:
response_msg['status'] = 202
response_msg['message'] = ' '
response_msg['data'] = book_ser.error_messages
return Response(response_msg)
# ser.py
class BooksSerializer(serializers.Serializer):
title = serializers.CharField()
publish = serializers.CharField()
price = serializers.DecimalField(max_digits=5, decimal_places=2)
# create
def create(self, validated_data): # validated_data――>
instance = Books.objects.create(**validated_data)
# instance――> ,
return instance
# urls.py
path('book/', views.BookView.as_view()),
데이터 수정데 이 터 를 수정 하려 면 직렬 화기 에서 update()방법 을 다시 써 야 합 니 다.
# views.py
class BookView(APIView):
def put(self, request, pk):
#
response_msg = {'status': 200, 'message': ' '}
#
book = Books.objects.filter(pk=pk).first()
#
book_ser = BooksSerializer(instance=book, data=request.data)
#
if book_ser.is_valid():
book_ser.save() # update()
response_msg['data'] = book_ser.data
else:
response_msg['status'] = 202
response_msg['message'] = ' '
response_msg['data'] = book_ser.error_messages
return Response(response_msg)
# urls.py
re_path('book/(?P<pk>\d+)', views.BookView.as_view()),
데이터 삭제
# views.py
class BooksView(APIView):
def delete(self, request, pk):
#
response_msg = {'status': 200, 'message': ' '}
#
Books.objects.filter(pk=pk).delete()
return Response(response_msg)
# urls.py
re_path('book/(?P<pk>\d+)', views.BooksView.as_view()),
5.모델 류 직렬 화 기DRF 는 Model Serializer 모델 클래스 직렬 화 기 를 제공 하여 Serializer 클래스 를 신속하게 만 드 는 데 도움 을 주 었 습 니 다.
ModelSerializer 는 일반적인 Serializer 와 같 지만 다음 을 제공 합 니 다.
모델 류 를 바탕 으로 일련의 필드 를 자동 으로 생 성 합 니 다
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book #
fields = '__all__' #
필드 조작1、fields 를 사용 하여 필드 를 명 확 히 할 수 있 습 니 다.all__그래서 필드 를 포함 하 는 것 을 표시 합 니 다.구체 적 인 필드->fields=('title','price')
2.exclude 는 그 필드 를 제외 하고 fields 와 함께 쓸 수 없다 는 뜻 입 니 다.->exclude=('price',)
3,추가 매개 변수 extrakwargs,필드 에 추가 인자 추가
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book #
fields = '__all__' #
# title = serializers.CharField(read_only = True)
extra_kwargs = {
'title': {'read_only': True},
}
6.소스 코드 분석 many=True우리 가 여러 개의 데 이 터 를 조회 해 야 할 때,실례 화 서열 화기 에서 many=True 를 전송 해 야 한다
book_ser = BooksSerializer(instance=books, many=True) #
book_one_ser = BooksSerializer(instance=book) #
print(type(book_ser))
#<class 'rest_framework.serializers.ListSerializer'>
print(type(book_one_ser))
#<class 'app01.ser.BookModelSerializer'>
# --> __new__ , , many=True, ListSerializer , Serializer
# __new__
def __new__(cls, *args, **kwargs):
# many=True, ListSerializer
if kwargs.pop('many', False):
return cls.many_init(*args, **kwargs)
return super().__new__(cls, *args, **kwargs)
drf 직렬 화 기 serializer 의 구체 적 인 사용 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 drf 직렬 화 기 serializer 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
TIL136. DRF : Serializer에 관하여✔️ 이에 프로그램의 object에 담긴 데이터를 어떤 외부 파일에 작성 및 전송할 때는 직렬화(Serialize)가 필요하고, 어떤 외부 파일의 데이터를 프로그램 내의 object로 읽어올 때는 역직렬화(Deser...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.