Notice
Recent Posts
Recent Comments
Link
«   2025/11   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
Tags more
Archives
Today
Total
관리 메뉴

최용우

Django 시리얼라이저, ReadOnlyField 본문

장고

Django 시리얼라이저, ReadOnlyField

용우쨩 2022. 2. 13. 17:39

시리얼라이저를 공부하다 몇가지 테스트를 해보았다.

회원가입 기능이 포함된 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가 적절하게 필요한것이다.