Relational fields are used to represent model relationships. They can be applied to
ForeignKey
,ManyToManyField
andOneToOneField
relationships, 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
}