# DRF serializers 요약

11634 단어
DRF serializers 요약
django settings 파일 찾기 순서
django 검색 변수의 순서는 사용자의 settings에서 먼저 찾은 다음 글로벌settings에서 찾습니다. 사용자 desettings 파일에서 찾으면 글로벌 을 계속 찾지 않습니다.settings의 설정 정보입니다.
django 원생의serializer
from django.db import models

# Create your models here.


class Courses(models.Model):
    title = models.CharField(max_length=32)
    description = models.CharField(max_length=128)
class CoursesView(View):
    def get(self, request):
        courses = list()

        for item in Courses.objects.all():
            course = {
                "title": item.title,
                "description": item.description
            }

            courses.append(course)

        return HttpResponse(json.dumps(courses, ensure_ascii=False))

위의 방식을 통해 우리는 규범에 부합되는 반환 데이터를 정의했고 규범에 부합되는 URL을 추가했다. 우리는 수동으로 REST 개발을 완성했지만 효율이 높지 않았다.
from django.core.serializers import serialize

class StudentView(APIView):
    def get(self, request):
        origin_Student = Student.objects.all()
        serialized_students = serialize("json", origin_students)
        return HttpResponse(serialized_students)

사용 방법은 매우 간단합니다. 모듈을 가져온 후 가격에 필요한 형식과queryset은serialize에 전송하여 서열화한 데이터를 되돌려줍니다.
만약 프로젝트가 일부 데이터만 서열화하고 인증, 권한 등 다른 기능을 사용할 필요가 없다면,django원생serializer를 사용할 수 있으며, 그렇지 않으면 DRF를 사용하는 것을 권장합니다.
파서 어셈블리
from django.http import JsonResponse
from rest_framework.view import APIView
from rest_framework.parsers import JSONParser, FormParser
# Create your views here.


class LoginView(APIView):
    def get(self, request):
        return render(request, 'parserver/logoin.html')
    def post(self, request):
        # request   drf       ,   django request
        # request.data   property,         
        # request.data     self.parser_classes               
        print(requet.data)  # {'username':'Gavin', 'password':123}
        return JsonResponse({'status_code':200, 'code':'ok'})


다음 절차를 따르십시오.
  • ​ from rest_framework.views import APIView
  • 상속 APIView
  • request를 직접 사용합니다.데이터로 Json 데이터를 얻을 수 있다
  • Json 데이터만 분석하면 다른 유형의 데이터 요청이 허용되지 않을 경우 다음을 수행할 수 있습니다.
  • ​ from rest_framework.views import JsonParse
  • 보기 클래스에parser 정의classes 변수, 값은 목록 유형[JsonParser]
  • Parserclasses = [], 데이터 형식의 요청을 처리하지 않습니다
  • 시리얼화된 구성 요소 사용
    from django.db import models
    # create your models here.
    
    
    class Publich(models.Model):
        nid = models.AutoField(primary_key=True)
        name = models.CharField(max_lenght=32)
        age = models.IntegerField()
        
        def __str__(self):
            return self.name
        
    class Author(models.Model):    
        nid = models.AutoField(primary_key=True)
        name = models.CharField(max_length=32)
        age = models.IntegerField()
    
        def __str__(self):
            return self.name  
    
        
     class Book(models.Model):
        title = models.CharField(max_length=32)
        publishDate = models.DateField()
        price = models.DecimalField(max_digits=5, decimal_places=2)
        publish = models.ForeignKey(to='Publish', to_field='nid', on_delete=models.CASCADE)
        authors = models.ManyToManyField(to='Author')
    

    서열화된 구성 요소를 통해 인터페이스 설계를 하고 먼저 URL을 설계한다.GET와POST를 예로 들면
    from django.ruls import re_path
    from serializers import views
    urlpatterns = [
        re_path(r'book/', views.BookView.as_view())
    ]
    

    새 이름: appserializers.py의 모듈, 모든 서열화 사용을 이 모듈에 집중하여 프로그램의 결합을 해결합니다.
    # -*- coding: utf-8 -*-
    from rest_framework import serializers
    
    from .models import Book
    
    
    class BookSerializer(serializers.Serializer):
        title = serializers.CharField(max_length=128)
        publish_date = serializers.DateTimeField()
        price = serializers.DecimalField(max_digits=5, decimal_places=2)
        publish = serializers.CharField(max_length=32)
        authors = serializers.CharField(max_length=32)
    

    이어서 정렬화된 구성 요소를 사용하여 시도 클래스를 쓰기 시작합니다
    from rest_framework.views import APIView
    from rest_framework.response import Response
    
    #   app    
    from .models import Book
    #       
    from .app_serializer import BookSerializer
    
    class BookView(APIView):
        def get(self, request):
            origin_books = Book.objects.all()
            serialized_books = BookSerializer(origin_books, many=True)
            return Response(serialized_books.data)
    

    모델 및 URL을 정의한 후 그룹 가격을 시리얼화할 수 있는 단계:
  • 가져오기 서열화 구성 요소:from restframework import serializers
  • 정의 서열화 클래스: 계승serializerrs.모든 서열화 클래스를 저장하기 위한 전용 모듈을 따로 만드는 것을 권장합니다.class Book Serializer (serializers. Serializer):pass
  • 되돌려야 할 필드를 정의합니다. (필드 형식은 모델의 형식과 일치하지 않을 수도 있고 파라미터도 조정할 수 있습니다) 필드 이름은 모델의 이름과 일치해야 합니다.
  • GET 인터페이스 또는 여러 개에서QuerySet
  • 얻기
  • 서열화 시작:QuerySet을 첫 번째 매개 변수로 서열화기 클래스에 전송합니다.many는 기본적으로False입니다. 만약 되돌아오는 데이터가 목록에 사전을 끼워 넣은 여러 대상의 집합이라면 many=True
  • 로 변경해야 합니다
  • 반환: 서열화 대상의 데이터 속성을 반환하면restframework.Response의 Response 객체로, DRF가 다시 패키지된 해당 객체입니다.이 대상은 응답 데이터를 되돌릴 때 클라이언트 유형을 판단하고 브라우저라면 웹 페이지 형식으로 되돌려주며 POSTMAN 같은 도구라면 Json 형식 데이터로 되돌려줍니다.또한 서열화 클래스의 필드 이름도 모델의 필드와 일치하지 않을 수 있지만,source 파라미터를 사용하여 구성 요소의 원래 필드 이름을 알려야 합니다. 일반적으로 우리는 같은 것으로 쓰면 됩니다.
    class BookSerializer(serializers.Serializer):
        BookTitle = serializers.CharField(max_length=128, source="title")
        publishDate = serializers.DateTimeField()
        price = serializers.DecimalField(max_digits=5, decimal_places=2)
        # source     ForeignKey  
        publish = serializers.CharField(max_length=32, source="publish.name")
        authors = serializers.CharField(max_length=32)
    
    그렇게 많은 다중 필드를 어떻게 처리합니까?source 매개 변수를 "authors.all"로 정의하면, 추출된 결과는QuerySet입니다. 이러한 데이터는 전방에 친밀하지 않기 때문에, 우리는 서열화기를 사용하여 끼워넣거나, 이렇게 할 수 있습니다.
    class BookSerializer(serializers.Serializer):
        title = serializers.CharField(max_length=32)
        price = serializers.DecimalField(max_digits=5, decimal_places=2)
        publishDate = serializers.DateField()
        publish = serializers.CharField()
        publish_name = serializers.CharField(max_length=32, read_only=True, source='publish.name')
        publish_email = serializers.CharField(max_length=32, read_only=True, source='publish.email')
        # authors = serializers.CharField(max_length=32, source='authors.all')
        authors_list = serializers.SerializerMethodField()
    
        def get_authors_list(self, authors_obj):
            authors = list()
            for author in authors_obj.authors.all():
                authors.append(author.name)
    
            return authors
    
    주의, get필드 이름과 일치해야 합니다. 그렇지 않으면 오류가 발생합니다.
    # -*- coding: utf-8 -*-
    from rest_framework.views import APIView
    from rest_framework.response import Response
    
    #   app    
    from .models import Book
    from .app_serializer import BookSerializer
    
    # Create your views here.
    
    
    class BookView(APIView):
        def get(self, request):
            origin_books = Book.objects.all()
            serialized_books = BookSerializer(origin_books, many=True)
    
            return Response(serialized_books.data)
    
        def post(self, request):
            verified_data = BookSerializer(data=request.data)
    
            if verified_data.is_valid():
                book = verified_data.save()
                #                          
                authors = Author.objects.filter(nid__in=request.data['authors'])
                book.authors.add(*authors)
    
                return Response(verified_data.data)
            else:
                return Response(verified_data.errors)
    
    POST 인터페이스의 구현 단계:
  • url 정의:post에 url를 추가하고 규범에 따라 url 포지셔닝 자원, http 요청 방식에 따라 사용자 행위를 정의해야 한다
  • post방법 정의: 보기 클래스에서post방법 정의
  • 서열화 시작: 우리가 정의한 서열화 클래스를 통해 서열화 대상을 만들고 매개 변수 데이터=request를 전송합니다.데이터(application/json) 데이터
  • 검사 데이터: 실례 대상을 통과한 isvalid () 방법으로 요청 데이터의 합법성을 검사합니다
  • 데이터 저장:save() 방법을 호출하여 데이터베이스에 데이터를 삽입
  • 다대다관계표에 데이터 삽입: 다대다 필드가 있으면 다대다관계표에 수동으로 데이터 삽입
  • 되돌아오기: 삽입된 대상을 되돌려줍니다. 워렌이 사용자 정의한 것이기 때문에 되돌아오는 데이터는 의미가 있고 사용자가 데이터를 삽입할 때serrializers입니다.Serializer가create를 실현하지 못했습니다. 우리는 수동으로 데이터를 삽입해야 합니다.
  •       #    ,         ,         models     
        class BookSerializer(serializers.Serializer):
          # nid = serializers.CharField(max_length=32)
            title = serializers.CharField(max_length=128)
            price = serializers.DecimalField(max_digits=5, decimal_places=2)
            publish = serializers.CharField()
            #     ,   __str__      
            publish_name = serializers.CharField(max_length=32, read_only=True, source='publish.name')
            publish_city = serializers.CharField(max_length=32, read_only=True, source='publish.city')
            # authors = serializers.CharField(max_length=32) # book_obj.authors.all()
          
            #                ,SerializerMethodField()
            authors_list = serializers.SerializerMethodField()
          
            def get_authors_list(self, book_obj):
                author_list = list()
          
                for author in book_obj.authors.all():
                    author_list.append(author.name)
          
                return author_list
          
             def create(self, validated_data):
                # {'title': 'Python666', 'price': Decimal('66.00'), 'publish': '2'}
                 validated_data['publish_id'] = validated_data.pop('publish')
                 book = Book.objects.create(**validated_data)
                 return book
          
              def update(self, instance, validated_data):
                  #           
                  instance.title = validated_data.get('title', instance.title)
                  instance.publishDate = validated_data.get('publishDate', instance.publishDate)
                  instance.price = validated_data.get('price', instance.price)
                  instance.publish_id = validated_data.get('publish', instance.publish.nid)
          
                  instance.save()
          
                  return instance
    
             ,    **             **?      ,               ,           ?
    
      ~~~python
      class BookSerializer(serializers.ModelSerializer):
          class Meta:
              model = Book
      
              fields = ('title',
                        'price',
                        'publish',
                        'authors',
                        'author_list',
                        'publish_name',
                        'publish_city'
                        )
              extra_kwargs = {
                  'publish': {'write_only': True},
                  'authors': {'write_only': True}
              }
      
          publish_name = serializers.CharField(max_length=32, read_only=True, source='publish.name')
          publish_city = serializers.CharField(max_length=32, read_only=True, source='publish.city')
      
          author_list = serializers.SerializerMethodField()
      
          def get_author_list(self, book_obj):
              #   queryset     [{}, {}, {}, {}]
              authors = list()
      
              for author in book_obj.authors.all():
                  authors.append(author.name)
      
              return authors
      ~~~
    
      #####      ModelSerializer   Serializer,**ModelSerializer Serializer     ,       :**
    
      - **  model        **
    
      - **         ,  unique_together  **
    
      - **         create() updata()**
    
      ~~~python
      class BookSerializer(serializers.ModelSerializer):
          class Meta:
              model = Book
              fields = ('title', 'price',)
              # fields = "__all__"
      ~~~

    좋은 웹페이지 즐겨찾기