ProgramingTip

Serializer의 create () 및 ModelViewset의 create () perform_create () 사용시기

bestdevel 2020. 11. 28. 10:12
반응형

Serializer의 create () 및 ModelViewset의 create () perform_create () 사용시기


django-rest-framework모델 생성과 관련 하여 주어진 문서를 작성하고 싶습니다 . 지금까지만 가능한 이벤트를 처리하는 방법에 대한 세 가지 접근 방식이 있음을 발견했습니다.

  1. Serializer의 create()메서드입니다. 다음은 문서입니다.

    class CommentSerializer(serializers.Serializer):
    
        def create(self, validated_data):
            return Comment.objects.create(**validated_data)
    
  2. ModelViewset create()메서드입니다. 선적 서류 비치

    class AccountViewSet(viewsets.ModelViewSet):
    
        queryset = Account.objects.all()
        serializer_class = AccountSerializer
        permission_classes = [IsAccountAdminOrReadOnly]
    
  3. ModelViewset perform_create()메서드입니다. 선적 서류 비치

    class SnippetViewSet(viewsets.ModelViewSet):
    
        def perform_create(self, serializer):
            serializer.save(owner=self.request.user)
    

이 세 가지 접근 방식은 애플리케이션 환경에 따라 중요합니다.

하지만 언제 각 create() / perform_create()기능 을 사용하고 있습니까 ??. 반면에 나는 modelviewset create()과 serializer의 단일 포스트 요청에 대해 두 개의 메서드가 호출 된 계정을 발견했습니다 create().

누구나 자신의 지식을 공유하여 설명 할 수 있기 때문에 바라며 이것이 제 개발 과정에 큰 도움이 될 것입니다.


  1. create(self, validated_data)AND "prod"값을 각 모델 필드에 저장하기 전에 추가 세부 정보를 추가하는 데 사용 합니다 **validated_data. 이상적으로 말해서, 이러한 형태의 "프 로딩"한 위치에서만을 수행하기를 원하므로 create귀하 방법

    CommentSerializer이 추론 좋습니다. 또한 자신의 데이터베이스에 계정을 저장하기 직전에 외부 API를 호출하여 사용자 계정을 만들 수 있습니다. create기능 은와 함께 합니다 ModelViewSet. 항상 생각하십시오- "얇은보기, 두꺼운 직렬 변환기".

예 :

def create(self, validated_data):
    email = validated.data.get("email", None)
    validated.pop("email") 
    # Now you have a clean valid email 
    # You might want to call an external API or modify another table
    # (eg. keep track of number of accounts registered.) or even
    # make changes to the email format.

    # Once you are done, create the instance with the validated data
    return models.YourModel.objects.create(email=email, **validated_data)
  1. create(self, request, *args, **kwargs)함수 는의 부모 인 클래스 ModelViewSet에서 정의 됩니다. 의 주요 기능은 다음과 가변합니다.CreateModelMixinModelViewSetCreateModelMixin

    from rest_framework import status
    from rest_framework.response import Response
    
    
    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
    
    def perform_create(self, serializer):
        serializer.save()
    

보시다시피 위의 create함수는 serializer에서 유효성 검사를 호출하고 올바른 응답을 생성합니다. 이것의 장점은 이제 애플리케이션에서 분리 할 수 ​​있고 평범하고 반복적 인 유효성 검사 호출과 응답 출력 처리에 대해 걱정하지 않을 것입니다. 이것은 create(self, validated_data)시리얼 라이저 (특정 애플리케이션이 상주 할 수있는 위치)에있는 것과 함께 잘 작동 합니다.

  1. 이제 perform_create(self, serializer)한 줄의 코드 로 별도의 함수 가있는 이유를 물어볼 수 있습니다 !?!? 음, 이것의 주된 이유는 save함수를 호출 할 때 커스터마이징을 허용하기 위해서 입니다. 호출하기 전에 추가 데이터를 제공하고 싶을 수도 있습니다 save (예serializer.save(owner=self.request.user) 를 들어 우리가를 가지고 있지 않다면 and perform_create(self, serializer)를 재정의해야 할 것입니다. create(self, request, *args, **kwargs)그것은 단지 무겁고 지루한 작업을하는 믹스 인의 목적을 무너 뜨립니다.

도움이 되었기를 바랍니다!

참고 URL : https://stackoverflow.com/questions/41094013/when-to-use-serializers-create-and-modelviewsets-create-perform-create

반응형