Programming Language/Django

Django 14)REST API_4

Sergemeow 2023. 4. 18. 17:29

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
    • 필드를 채우는데 사용할 속성의 이름
    • 점 표기법을 사용하여 속성을 탐색할 수 있음

'Programming Language > Django' 카테고리의 다른 글

Django 13)REST API_3  (0) 2023.04.18
Django 12)REST API_2  (0) 2023.04.13
Django 11)REST API_1  (0) 2023.04.13
Django 10)Authorization/Authentication_2  (0) 2023.04.12
Django 09)Authorization/Authentication_1  (0) 2023.04.12