
Relational fields are used to represent model relationships. They can be applied to
ForeignKey,ManyToManyFieldandOneToOneFieldrelationships, as well as to reverse relationships, and custom relationships such asGenericForeignKey.관계 필드는 모델 관계를 나타내는 데 사용됩니다.
외부 키,다대다 필드및일대일 필드관계뿐만 아니라 역관계 및 사용자 지정 관계와 같은일반 외부 키에도 적용할 수 있습니다.ㅡ django-rest-framework
관계형 필드를 사용하는 경우, serializer에서는 위와 같은 field를 사용할 수 있다. 주로 PrimaryKeyRelatedField와 StringRelatedField를 많이 사용한다.

PK로 표현된다.

String으로 표현된다.

이전 포스팅 'Detail Page 구현'을 참고하면 코드에 대한 상세 내용을 알 수 있다.
# views.py
def get_prev_next(instance):
try:
prev = instance.get_previous_by_update_dt() # Django 기본 메서드
except instance.DoesNotExist:
prev = None
try:
next_ = instance.get_next_by_update_dt() # Django 기본 메서드
except instance.DoesNotExist:
next_ = None
return prev, next_
class PostRetrieveListAPIView(RetrieveAPIView):
queryset = Post.objects.all()
serializer_class = PostSerializerDetail
def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
prevInstance, nextInstance = get_prev_next(instance)
commentList = instance.comment_set.all()
data = {
'post': instance,
'prevPost': prevInstance,
'nextPost': nextInstance,
'commentList' : commentList,
}
serializer = self.get_serializer(instance = data)
return Response(serializer.data)
# serializers.py
class PostRetrieveSerializer(serializers.ModelSerializer):
class Meta:
model = Post
exclude = ['create_dt'] # 'create_dt' 외 모든 데이터 전송

# serializers.py
class PostRetrieveSerializer(serializers.ModelSerializer):
category = serializers.StringRelatedField()
tags = serializers.StringRelatedField(many=True)
class Meta:
model = Post
exclude = ['create_dt'] # 'create_dt' 외 모든 데이터 전송

이 부분은 이전에 'Pagination 구현' 포스팅 4. 이미지 url: 경로 부분만 표시 에서 구현한 코드를 붙여넣었다.
# views.py
class PostRetrieveListAPIView(RetrieveAPIView):
queryset = Post.objects.all()
serializer_class = PostSerializerDetail
def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
prevInstance, nextInstance = get_prev_next(instance)
commentList = instance.comment_set.all()
data = {
'post': instance,
'prevPost': prevInstance,
'nextPost': nextInstance,
'commentList' : commentList,
}
serializer = self.get_serializer(instance = data)
return Response(serializer.data)
def get_serializer_context(self):
return {
'request': None,
'format': self.format_kwarg,
'view': self
}
