Serializer의 create () 및 ModelViewset의 create () perform_create () 사용시기
django-rest-framework
모델 생성과 관련 하여 주어진 문서를 작성하고 싶습니다 . 지금까지만 가능한 이벤트를 처리하는 방법에 대한 세 가지 접근 방식이 있음을 발견했습니다.
Serializer의
create()
메서드입니다. 다음은 문서입니다.class CommentSerializer(serializers.Serializer): def create(self, validated_data): return Comment.objects.create(**validated_data)
ModelViewset
create()
메서드입니다. 선적 서류 비치class AccountViewSet(viewsets.ModelViewSet): queryset = Account.objects.all() serializer_class = AccountSerializer permission_classes = [IsAccountAdminOrReadOnly]
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()
.
누구나 자신의 지식을 공유하여 설명 할 수 있기 때문에 바라며 이것이 제 개발 과정에 큰 도움이 될 것입니다.
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)
의
create(self, request, *args, **kwargs)
함수 는의 부모 인 클래스ModelViewSet
에서 정의 됩니다. 의 주요 기능은 다음과 가변합니다.CreateModelMixin
ModelViewSet
CreateModelMixin
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)
시리얼 라이저 (특정 애플리케이션이 상주 할 수있는 위치)에있는 것과 함께 잘 작동 합니다.
- 이제
perform_create(self, serializer)
한 줄의 코드 로 별도의 함수 가있는 이유를 물어볼 수 있습니다 !?!? 음, 이것의 주된 이유는save
함수를 호출 할 때 커스터마이징을 허용하기 위해서 입니다. 호출하기 전에 추가 데이터를 제공하고 싶을 수도 있습니다save
(예serializer.save(owner=self.request.user)
를 들어 우리가를 가지고 있지 않다면 andperform_create(self, serializer)
를 재정의해야 할 것입니다.create(self, request, *args, **kwargs)
그것은 단지 무겁고 지루한 작업을하는 믹스 인의 목적을 무너 뜨립니다.
도움이 되었기를 바랍니다!
'ProgramingTip' 카테고리의 다른 글
Coq에 비해 Isabelle 증명 보조의 강점과 약점은 무엇입니까? (0) | 2020.11.28 |
---|---|
Python에서 ''.join ()이 + =보다 빠른 이유는 무엇입니까? (0) | 2020.11.28 |
페이지 새로 고침시 Vuex 상태 (0) | 2020.11.28 |
Mercurial에서 기본 diff 도구를 사용합니까? (0) | 2020.11.28 |
nonce를 만들고 사용하는 방법 (0) | 2020.11.28 |