[TIL #56] 최종프로젝트 #5 시리얼라이저 변경

안떽왕·2023년 6월 13일
0

Today I Learned

목록 보기
58/76

어제 erd 변경으로 인한 작업의 연속이였습니다. 이미 어제 모델작업을 일찍 끝마쳤고 시리얼라이저를 변경하는 작업에 많은 시간을 들였던 만큼 금방 끝나리라 생각했습니다.

하지만 오늘 아침부터 개발을 진행하다가 테이블을 하나 더 생성하면 너무도 작업하기 편하고 코드도 깔끔해질 것 같다는 생각이 들어 건의했고 erd를 다시 한 번 수정하게 되었습니다.

외래키를 2개 보유한 새로운 모델하나를 작성하고 시리얼라이저 작업을 이어나갔습니다. 어제 미리 해놓았던 것들이 있었기에 금방 끝날거라 생각했으나 시리얼라이저 수정작업의 진행이 너무 더뎠고 팀원분에게 도움을 요청하고 나서야 저녁즈음에 끝낼 수 있었습니다.

오늘은 에러가 너무 많이나와서 어떤 걸 꼽기는 어려울 것 같고 글 작성하는 시리얼라이저 하나를 들고 왔습니다.

class RouteCreateSerializer(serializers.ModelSerializer):
    areas = RouteAreaSerializer()

    class Meta:
        model = Route
        fields = ('title', 'title', 'content', 'image', 'cost', 'duration', 'routespot', 'areas')
    
    def create(self, validated_data):
        route_area_data = validated_data.pop('areas')
        routespot_data = validated_data.pop('routespot')

        route = Route.objects.create(**validated_data)
        routearea = RouteArea.objects.create(route=route, **route_area_data)

        route.routespot.add(*routespot_data)
        return route

먼저 이 시리얼라이저는 본래 10줄 가량으로 스타트해서 수정하며 30줄이 넘어가는 코드가 되었다가 팀원분의 도움으로 지금의 상태까지 올 수 있었습니다.

areas는 이번에 새로 추가시킨 모델과 관련이 있는 시리얼라이저입니다. RouteArea모델에는 지역코드와 여행루트를 게시하는 게시글의 아이디를 외래키로 받습니다.

Route 모델에 들어있는 필드였다면 별도의 처리를 할 필요가 없지만 다대다 관계로 있는 routespot필드와 외래키로 엮여있는 areas는 별도처리를 진행했습니다.

views에서 유효성 검사를 통과해 넘어온 데이터 중 areas와 routespot의 데이터를 각각 pop을 통해 뽑아 할당했습니다.

route_area_data = validated_data.pop('areas')
routespot_data = validated_data.pop('routespot')

그렇게 가져온 데이터는 모델에 넣어서 새로운 객체를 생성해줍니다.

route = Route.objects.create(**validated_data)
routearea = RouteArea.objects.create(route=route, **route_area_data)

routearea에 route를 넣는 이유는 RouteArea모델에 route가 필요하기 때문에 route_area_data안에는 없는 route를 따로 지정해줍니다.

route.routespot.add(*routespot_data)
return route

이제 생성된 route객체에는 받아온 routespot_data를 추가해주면 완성입니다.

이렇게보니 별거없는 코드같은데... 코드를 작성할 당시에는 뜻대로 되지 않았던 것 같습니다. 원하는 코드를 상세히 적어도 에러가나고 축약해 적어도 에러가나고 오타로 에러나고 오늘은 들인 시간에 비해 진척도가 많이 나오지 못해 참으로 아쉬운 날이였습니다.

profile
이제 막 개발 배우는 코린이

0개의 댓글