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)
3.클래스 에 정렬 할 필드 를 쓰 고 그 필드 를 정렬 하려 면 클래스 에 그 필드 를 쓰 십시오.
from rest_framework import serializers
class BooksSerializer(serializers.Serializer):
    title = serializers.CharField()
    publish = serializers.CharField()
    price = serializers.DecimalField()
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()),
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": "    "   ――――》          
    }
}
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]"
    }
}
# 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"
    }
}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('          ')
필드 의 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]) #   모든
# 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()),
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},
        }
우리 가 여러 개의 데 이 터 를 조회 해 야 할 때,실례 화 서열 화기 에서 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)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.