[DRF]Serializer relations

박민하·2022년 9월 27일
0

DRF

목록 보기
6/9

 Relational fields are used to represent model relationships. They can be applied to ForeignKey, ManyToManyField and OneToOneField relationships, as well as to reverse relationships, and custom relationships such as GenericForeignKey.

 관계 필드는 모델 관계를 나타내는 데 사용됩니다. 외부 키, 다대다 필드일대일 필드 관계뿐만 아니라 역관계 및 사용자 지정 관계와 같은 일반 외부 키에도 적용할 수 있습니다.

 ㅡ django-rest-framework

✅ Serializer relations?

  관계형 필드를 사용하는 경우, serializer에서는 위와 같은 field를 사용할 수 있다. 주로 PrimaryKeyRelatedFieldStringRelatedField를 많이 사용한다.

1. PrimaryKeyRelatedField

  PK로 표현된다.

2. StringRelatedField

  String으로 표현된다.

✅ 목표

  • category 와 tags 필드를 추가한다.
  • 이미지 url은 경로 부분만 표시한다.

✅ 기존 코드

  이전 포스팅 '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' 외 모든 데이터 전송

✔ StringRelatedField 추가

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

✔ 이미지 url: 경로 부분만 표시

  이 부분은 이전에 '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
        }

✔ 결과

profile
backend developer 🐌

0개의 댓글