728x90

 

목차

  1. 사전 준비
  2. N:1 - 역참조 데이터 조회
  3. Django shortcuts functions

1. 사전 준비

 

  • Comment 모델 작성 및 데이터베이스 초기화
  • 이후 Migration 진행

 

 

GET - List
  • 댓글 데이터 목록 조회하기
  • Article List와 비교하며 작성해보기

 

GET - Detail
  • 단일 댓글 데이터 조회하기
  • Article과 달리 같은 serializer 사용하기

 

POST

 

 

Passing Additional attirbutes to .save()
  • .save() 메서드는 특정 Serializer 인스턴스를 저장하는 과정에서 추가적인 데이터를 받을 수 있음
  • CommentSerializer를 통해 Serialize되는 과정에서 Parameter로 넘어온 article_pk에 해당하는 article 객체를 추가적인 데이터를 넘겨 저장

 

  • POST 응답 확인
  • 에러가 발생
    • CommentSerializer에서 article field 데이터 또한 사용자로부터 입력 받도록 설정되어 있기 때문

 

읽기 전용 필드 설정
  • read_only_fields를 사용해 외래 키 필드를 '읽기 전용 필드'로 설정
  • 읽기 전용 필드는 데이터를 전송하는 시점에 '해당 필드를 유효성 검사에서 제외시키고 데이터 조회 시에는 출력'하도록 함

 

DELETE & PUT
  • 댓글 데이터 삭제 및 수정 구현하기


2. N:1 - 역참조 데이터 조회

 

특정 게시글에 작성된 댓글 목록 출력하기
  • 기존 필드 override - Article Detail
    • "게시글 조회 시 해당 게시글의 댓글 목록까지 함께 출력하기"
    • Serializer는 기존  필드를 override 하거나 추가적인 필드를 구성할 수 있음
  • PrimaryKeyRelatedField()

 

  • modles.py에서 related_name을 통해 이름 변경 가능
  • 역참조 시 생성되는 comment_set을 override 할 수 있음

 

  • Nested relationships

  • 모델 관계 상으로 참조 된 대상은 참조하는 대상의 표현에 포함되거나 중첩(nested) 될 수 있음
  • 이러한 중첩된 관계를 serializers를 필드로 사용하여 표현 할 수 있음
  • 두 클래스의 상/하 위치를 변경해야 함

 

특정 게시글에 작성된 댓글의 개수 출력하기
  • 새로운 필드 추가 - Article Detail
    • 게시글 조회 시 해당 게시글의 댓글 개수까지 함께 출력하기

  • source
    • serializers field's argument
    • 필드를 채우는 데 사용할 속성의 이름
    • 점 표기법(dotted notation)을 사용하여 속성을 탐색 할 수 있음

 

※ [주의] 읽기 전용 필드 지정 이슈

  • 특정 필드를 override 혹은 추가한 경우 read_only_fields가 동작하지 않으니 주의


3. Django shortcuts functions

 

get_object_or_404()
  • 모델 manager objects에서 get()을 호출하지만, 해당 객체가 없을 땐 기존 DoesNotExist 예외 대신 Http404를 raise 함

 

get_list_or_404()
  • 모델 manager objects에서 filter()의 결과를 반환하고 해당 객체 목록이 없을 땐 Http404를 raise함

 

※ 사용 이유

  • 클라이언트 입장에서 "서버에 오류가 발생하여 요청을 수행할 수 없다(500)"라는 원인이 정확하지 않은 에러를 마주하기 보다는, 서버가 적절한 예외 처리를 하고 클라이언트에게 올바른 에러를 전달하는 것 또한 중요한 요소
728x90

'Back-end > Django' 카테고리의 다른 글

[Django] Rest framework-Single Model  (0) 2022.10.20
[Django] Response JSON  (0) 2022.10.20
[Django] REST API  (0) 2022.10.18
[DB with Django] M:N (User - User)  (0) 2022.10.13
[DB with Django] M:N (Article - User)  (0) 2022.10.13