• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    해결됨

오류를 이해를 못하겠습니다.

22.07.11 14:34 작성 조회수 343

0

AssertionError at /post/

The `.create()` method does not support writable nested fields by default.
Write an explicit `.create()` method for serializer `instagram.serializers.PostSerializer`, or set `read_only=True` on nested serializer fields.




저 오류로 프로젝트 2번 갈아 엎었는데 똑같은 곳에서 계속 막히네요.


답변 1

답변을 작성해보세요.

1

안녕하세요.

뷰에서는 PostSerializer를 통해 시리얼라이저 처리를 하고 있고, PostSerializer 내에서는 AuthorSerializer를 중첩해서 사용하고 있습니다. PostSerializer 입장에서 AuthorSerializer는 nested fields 인 것이죠.

DRF 기본에서는 중첩된 필드에 대해서 조회는 가능하지만, 생성은 지원하지 않습니다. 그래서 아래 시리얼라이저 구성에서 "Post 생성 API"를 호출하셨을 테고, 말씀하신 에러 메세지를 만나셨을 것입니다.

에러 메세지 대로

방법1) PostViewSet의 create 메서드를 직접 구현하여 PostSerializer를 핸들링하는 로직을 직접 구현해주실 수도 있겠구요.

방법2) DRF 기본 기능에서는 author 필드는 조회만 수행되도록 read_only=True 옵션을 추가해주세요. 그럼 포스팅 조회 시에는 author 필드가 조회되지만, 포스팅 생성 시에는 author 필드값을 받지 않게 됩니다.

author = AuthorSerializer(read_only=True)

앞서서 여러 기능을 구현할 때에도 저장한 유저에 대한 지정은 뷰에서 form.is_valid()가 참일 때 request.user 를 통해서 지정했었을 것입니다. 절대 유저로부터 입력된 author 값으로 DB에 저장해서는 안 됩니다.

author 필드에 대한 지정은 PostViewSet 단에서는 perform_create 를 재정의하여 구현해보실 수 있습니다.

# PostViewSet 클래스 내에서
def perform_create(self, serializer):
... serializer.save(author=self.request.user)

그리고 이 PostViewSet에는 CREATE 처리 시에 IsAuthenticated 권한이 필히 지정되어야할 것입니다.

---

화이팅입니다. :-)