데이터 분석 기술 블로그

Django에 대하여(38)_DRF 역참조 데이터 구성 본문

백엔드

Django에 대하여(38)_DRF 역참조 데이터 구성

데이터분석가 이채은 2024. 5. 26. 09:00

1. Article → Comment 간 역참조 관계를 활용한 JSON 데이터 재구성

아래 2가지 사항에 대한 데이터 재구성하기

  1. 단일 게시글 조회 시 해당 게시글에 작성된 댓글 목록 데이터도 함께 붙여서 응답
  2. 단일 게시글 조회 시 해당 게시글에 작성된 댓글 개수 데이터도 함께 붙여서 응답

2. 단일 게시글 + 댓글 목록

Nested relationships

  • 모델 관계상으로 참조하는 대상은 참조되는 대상의 표현에 포함되거나 중첩될 수 있다.
  • 이러한 중첩된 관계는 serializers를 필드로 사용하여 표현 가능
# articles/serializers.py
class CommentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Comment
        fields = '__all__'
        read_only_fields = ('article',)

class ArticleSerializer(serializers.ModelSerializer):
    comment_set = CommentSerializer(many=True, read_only=True)
    
    class Meta:
        model = Article
        fields = '__all__'
        read_only_fields = ('article',)

class ArticleSerializer(serializers.ModelSerializer):
    comment_set = CommentSerializer(many=True, read_only=True)
    
    class Meta:
        model = Article
        fields = '__all__'

GET http://127.0.0.1:8000/api/v1/articles/2/ 응답 확인


3. 단일 게시글 + 댓글 개수

댓글 개수에 해당하는 새로운 필드 생성

 

'source'

  • 필드를 채우는 데 사용할 속성의 이름
  • 점 표기법(dotted notation)을 사용하여 속성을 탐색할 수 있다.
# articles/serializers.py

class ArticleSerializer(serializers.ModelSerializer):
    comment_set = CommentSerializer(many=True, read_only=True)
    comment_count = serializers.IntegerField(source='comment_set.count', read_only=True)
    
    class Meta:
        model = Article
        fields = '__all__'

GET http://127.0.0.1:8000/api/v1/articles/3/ 응답 확인


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

  • 특정 필드를 override 혹은 추가한 경우 read_only_fields는 동작하지 않습니다.
  • 해당 필드의 read_only 키워드 인자로 작성해야 합니다.