최용우
Django 시리얼라이저, ReadOnlyField 본문
시리얼라이저를 공부하다 몇가지 테스트를 해보았다.
회원가입 기능이 포함된 Todo리스트 프로젝트의 일부이다.
게시판 모델에 username이라는 필드가 정의 되어있는데 이 필드는 User 모델의 외래키다.
처음에는 게시판 시리얼라이저를 아래와 같이 정의했다.
class TodoSerializer(serializers.ModelSerializer):
class Meta:
model = todolist
fields = ('date','username', 'title', 'repeat',)
그리고 게시글을 등록하려고 하니까
username : "this fields is required."
라는 오류가 뜬다.
분명히 fields 튜플에 'username'을 지정했고 모델에 저장 시 perform_create함수에
request.user로 username에 대한 정보를 넘겨주었음에도 불구하고 위와 같은 오류에 직면한 것이다.
이유가 궁금하여 시리얼라이저에 대한 공부가 시작된 것이다.
사실해결방법은 알고 있었는데 나즈막히 찝찝하게 아는것들이 싫어 이참에 확실하게 짚고 넘어가자.
결론
class TodoSerializer(serializers.ModelSerializer):
username = serializers.ReadOnlyField(source='username.username')
class Meta:
model = todolist
fields = ('date','username', 'title', 'repeat',)
serializer.py에 username이라는 필드를 추가해주기만 하면된다. 그런데 왜?
이유
클라이언트 <- (json) -> 시리얼라이저.py <- (python orm) -> 데이터베이스
데이터베이스에서 조회한 값들을 클라이언트로 보내는 과정을 시리얼라이즈라고 하고
반대로 클라이언트가 보낸 데이터를 데이터베이스에 저장하는 과정을 디시리얼라이즈라고 한다.
이 양방향의 소통을 시리얼라이저.py가 하고 있는 것이다.
views.py에 overide한 perform_create 함수다
def perform_create(self, serializer):
serializer.save(username=self.request.user)
여기서 .save() 함수는 is_valid()가 실행된 후에 호출된다.
만약 내가 username = serializers.ReadOnlyField(source='username.username')
ReadOnlyField라고 선언해주지 않았다면 is_valid() 함수에서 부적합 판정을 받을 것이다.
그 결과가 username : "this fields is required." 이것이다.
perform_create 함수는 is_valid()가 true로 판정이 나야 호출되고 그제서야
username=self.request.user <- 이 인자를 전달하여 최종적으로 데이터베이스에 저장하게 된다.
그래서 모델에 인스턴스를 write(생성) 할 때도 ReadOnlyField가 적절하게 필요한것이다.
'장고' 카테고리의 다른 글
| 장고 ReadOnlyField의 쓰임 (1) | 2022.02.26 |
|---|---|
| 장고 테스트 케이스 사용법 (0) | 2022.02.14 |
| 하나의 서버에서 2개 이상 django 프로젝트 배포하기 (2) | 2022.02.12 |
| requirements.txt 만들기 (2) | 2022.02.09 |
| 장고 + Nginx + Gunicorn 배포하기 (2) | 2022.02.09 |