drf 직렬 화기 serializer 의 구체 적 인 사용

1.직렬 화 기-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()
그리고 매개 변 수 는 다음 과 같 습 니 다.
  • required  이 필드 가 역 직렬 화 될 때 입력 해 야 한 다 는 것 을 나타 낸다.기본 트 루
  • default   역 직렬 화 시 사용 하 는 기본 값
  • allow_null  이 필드 가 None 에 들 어 갈 수 있 는 지 여 부 를 표시 합 니 다.기본 False
  • validators  이 필드 에서 사용 하 는 검증 기
  • error_messages 오류 번호 와 오류 정 보 를 포함 하 는 사전
  • 3.반 직렬 화 데이터 검증
    직렬 화 기 를 사용 하여 데 이 터 를 반 직렬 화 할 때 데 이 터 를 검증 해 야 합 니 다.검사 에 성공 한 데이터 만 모델 류 대상 으로 저장 할 수 있 습 니 다.
    검사 할 데 이 터 를 직렬 화기 에 전송 하고 실례 화:obj=BooksSerializer(data=request.data),호출 isvalid()방법 검증,검증 성공 반환 True,실패 반환 False.
    실패,직렬 화 대상 의 errors 를 통 해 오류 정보(사전)를 얻 을 수 있 습 니 다.
    성공,공공 서열 화 대상 의 validateddata 속성 에서 데 이 터 를 가 져 옵 니 다.
    검사 방법 은 부분 갈고리,전역 갈고리,vaidators,직렬 화 유형 과 필드 속성 도 있 습 니 다.
    필드 속성
  • max_length  최대 길이
  • min_lenght  최소 길이
  • allow_blank  비어 있 는 지 여부
  • trim_whitespace 공백 문 자 를 차단 할 지 여부 입 니 다
  • max_value  최소 값
  • min_value  최대 치
    국부 갈고리
    직렬 화 클래스 에 부분 갈고리 만 들 기: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 와 같 지만 다음 을 제공 합 니 다.
    모델 류 를 바탕 으로 일련의 필드 를 자동 으로 생 성 합 니 다
  • 4.567917.모델 류 를 바탕 으로 자동 으로 Serializer 로 vaidators 를 생 성 합 니 다.예 를 들 어 유 니 크together
  • 기본 create()와 update()를 포함 합 니 다
  • 실례:
    
    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 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기