perform_create()

data_hamster·2023년 4월 30일
0
post-custom-banner

학습주제
사용자와 인증
perform_create()

학습내용

DB 복원

노트북에서 DB를 직접 메일로 가져왔다.

그렇다고 한다.
복원이 정상적으로 되었다. admin 비밀번호를 자동완성으로 해놨는지 접속이 되지않아.cmd에서 createsupersuer로 한개 더 만들어 접속하였다.

이번엔 perform_create()를 사용하여 상속, 오버라이딩을 자세히 해본다.
perform_create()의 동작순서는

  • urls.py question/ 요청이 들어옴
  • path의 QuestionList로 연결 .as_view()에서 처리하는데 호스트 요청은 post로 처리됨.
  • QuestionList는 ListCreateAPIView를 상속받는다
  • get, post 메소드가 구현되어 있다. 사실상 QuestionList에 해당 기능이 구현되어 있는것이나 마찬가지.
  • 요청이 post였기에 post메소드로 들어간다 create를 수행한다. create라는 메소드도 상속받은 클래스 내에 있는데, ListCreateAPIView의 또다른 부모 클래스인 mixins.CreateModelMixin에 구현되어있다.

create의 동작하는 코드들을 살펴보면 중간에 self.perform_create(serializer)가 있다.
perform_create를 통해 serializer.save()가 동작한다.

여기에 정의되어 있는 perfrom_create를 자식의 자식뻘인 손자 클래스에서 오버라이드를 한다.
그렇게되면 CreateModelMixin에서 perform_create를 수행할 때 기존 메소드를 호출하는 것이 아닌 뷰에 있는 QuestionList의 perform_create이 수행. 기능을 더한
serializer.save(owner=self.request.user)
저장을 하면서 owner에 현재 리퀘스트의 유저를 넣도록 한다.

이를 도식화하면

부모클래스를 따라가면서 기능을 짚어보는것도 괜찮은 방법

serializer.save(owner=self.request.user)에서

class QuestionSerializer(serializers.ModelSerializer):
    owner = serializers.ReadOnlyField(source='owner.username')
    class Meta:

이렇게 owner는 읽기전용이라고 정의되어 있었다. 그런데 어떻게 owner를 사용할 수 있을까?
장고 셀을 열어 확인한다.
from polls_api.serializers import QuestionSerializer
새로운 시리얼라이저 생성
question_serializer = QuestionSerializer(data={"question_text": "some text"})
만든 후엔 제일 먼저 정합성 테스트를 한다.
question_serializer.is_valid()

question_serializer.validated_data

여기엔 owner가 들어가 있지 않다. owner는 Readonly이기 때문에 인스턴스로부터 읽어올 수만 있지 시리얼라이저로 값을 밀어넣을 수는 없다.

그러나, question_serializer.save를 이용할 때는 어떤 값이든 제공할 수 있다. 심지어 ID도 줄 수 있다.
question = question_serializer.save(id=10000)
question.id

세이브를 할 때는 주어진 필드를 그대로 가져다 쓴다.

따라서 readonly와 상관없이 시리얼라이저.save시에 값을 넣을 수 있다.

요약

  • 손자 클래스에서 부모의 부모 클래스의 메소드를 오버라이딩 해서 사용할 수 있다.
  • serializer.save(owner=self.request.user) 이때는 readonly와 상관없이 필드값을 그대로받아서 저장
profile
반갑습니다 햄스터 좋아합니다
post-custom-banner

0개의 댓글