본문 바로가기

개발일지/TIL

TIL 23-06-09 serializer 고민하기

https://sdoram.tistory.com/182

 

최종 팀 프로젝트[front] navbar

navbar 구현하는 방법들 1. 각각의 html에서 navbar를 다르게 구현하기 장점 : 각 페이지의 상황에 맞춰서 navbar구현 가능 단점 : html의 가독성 저하, 생산성 낮음, 수정사항 발생시 휴먼 에러 가능성 증

sdoram.tistory.com

 

1.하나의 url에서 다른 정보 보여주기 

 문제점

order_by나 pagination을 구현할 때는 정보의 순서만 바뀌고 같은 데이터 구조를 가지고 있었는데 지금 구현하고 싶은 부분은 review와 accompany를 바꿔가면서 보여주길 원한다. 

 시도해 본 것들

class ExhibitionReviewSerializer(serializers.ModelSerializer):
    """전시회 상세보기 리뷰"""

    reviews = ReviewSerializer(source="review_set", many=True)
    # accompanies = AccompanySerializer(many=True)

    class Meta:
        model = Exhibition
        fields = [
            "id",
            "user_id",
            "info_name",
            "content",
            "location",
            "image",
            "created_at",
            "updated_at",
            "category",
            "start_date",
            "end_date",
            "reviews",
            # "accompanies",
        ]


class ExhibitionAccompanySerializer(serializers.ModelSerializer):
    """전시회 상세보기 동행구하기"""

    # reviews = ReviewSerializer(source="review_set", many=True)
    accompanies = AccompanySerializer(many=True)

    class Meta:
        model = Exhibition
        fields = [
            "id",
            "user_id",
            "info_name",
            "content",
            "location",
            "image",
            "created_at",
            "updated_at",
            "category",
            "start_date",
            "end_date",
            # "reviews",
            "accompanies",
        ]

 

class ExhibitionDetailView(APIView):
    def get_permissions(self):
        if self.request.method in ["PUT", "DELETE"]:
            return [IsAdminUser()]
        return [IsAuthenticatedOrReadOnly()]

    def get(self, request, exhibition_id):
        exhibition = get_object_or_404(Exhibition, id=exhibition_id)
        select = request.query_params.get("select", None)
        if select == "review":
            serializer = ExhibitionReviewSerializer(exhibition)
        elif select == "accompany":
            serializer = ExhibitionAccompanySerializer(exhibition)
        else:
            serializer = ExhibitionReviewSerializer(exhibition)
        return Response(serializer.data)

지금 구현한 방식은 query_params로 선택할 serializer를 구분하는 방식으로 구현했다.

하지만 하나의 용도에서 2가지 serializer를 선언해야 하는 점이 개선할 코드가 없을지 고민된다. 

 

하나의 serializer로 보여주고 프론트에서 구분하기 

아직 시도하지 않았지만 review와 accompany의 데이터 양이 다를 경우 pagination에서 문제가 생길 가능성 있을 것 같다.

 

serailizer에 select정보를 집어넣고 if문 처리하기 

아직 시도하지 않아서 가능한지 여부를 알 수 없지만 data=request.data처럼 데이터를 집어넣을 수 있으니 select=select같은 방식으로 가능한지 확인해보기 

 

 알게 된 점

serializer를 커스텀할 일이 크게 없어서 만들어진 것을 활용하기만 주로 했는데 이번 주말에 좀 더 깊게 파보면서 알아봐야 할 것 같다.