학습주제
사용자와 인증
perform_create()
학습내용
노트북에서 DB를 직접 메일로 가져왔다.
그렇다고 한다.
복원이 정상적으로 되었다. admin 비밀번호를 자동완성으로 해놨는지 접속이 되지않아.cmd에서 createsupersuer로 한개 더 만들어 접속하였다.
이번엔 perform_create()를 사용하여 상속, 오버라이딩을 자세히 해본다.
perform_create()의 동작순서는
question/
요청이 들어옴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시에 값을 넣을 수 있다.