N:1 - 역참조 데이터 조회
특정 게시글에 작성된 댓글 목록 출력
- 기존 필드 override - Article DEtail
- 게시글 조회시 해당 게시글의 댓글 목록까지 함께 출력
- Serializer는 기존 필드를 override 하거나 추가적인 필드를 구성할 수 있음
1. PrimayKeyRelatedField()
# articles/serializers.py
class ArticleSerializer(serializers.ModelSerializer):
comment_set = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
class Meta:
model = Article
fields = '__all__'
- models.py에서 related_name을 통해 이름 변경 가능
- 역참조 시 생성되는 comment_set을 override 할 수 있음
# articles/models.py
class Comment(models.Model):
article = models.ForeignKey(Article, on_delete=models.CASCADE, related_name='comments')
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
2. Nested relationships
# articles/serializers.py
class CommentSerializer(serializers.ModelSerializer):
class Meta:
model = Comment
fields = '__all__'
read_only_fields = ('articles',)
class ArticleSerializer(serializers.ModelSerializer):
comment_set = CommentSerializer(many=True, read_only=True)
class Meta:
model = Article
fields = '__all__'
- 모델 관계 상으로 참조된 대상은 참조하는 대상의 표현에 포함되거나 중첩(nested)될 수 있음
- 이러한 중첩된 관계는 serializers를 필드로 사용하여 표현 할 수 있음
- 두 클래스의 상/하 위치를 변경해야함
특정 게시글에 작성된 댓글의 개수 출력하기
- 새로운 필드 추가 - Article Detail
- “게시글 조회 시 해당 게시글의 댓글 개수까지 함께 출력하기”
# 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__'
- source
- serializers field’s argument
- 필드를 채우는데 사용할 속성의 이름
- 점 표기법을 사용하여 속성을 탐색할 수 있음