본문 바로가기
프로젝트/나혼자 프로젝트

Nadle_리뷰CRUD(is_valid(), SerializerMethodField)

by 수쨔앙 2022. 11. 16.

1. 리뷰 목록/생성/수정/삭제

리뷰 생성할 때

class ReviewCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = Review
        fields = '__all__'

 이렇게 했더니 user와 music 값은 필수라고 400에러가 떴다.

리뷰 작성할 때는 content와 grade만 있으면 되니까 수정해주자

 

수정을 해줬는데도

NOT NULL constraint failed: musics_review.music_id

이런 오류가 났다 오류가 났다.

music_id가 없다구???? 맞아 없어

 

serialize.is_valid()로 모델에서 정의한 필요한 것, 조건들이(data=request.data) 제대로 들어왔는지 유효성 검사를 한다.

유효성검사를 통과한 것들(data=request.data)  중에서 review는 사용자와 music_id를 담아줘야되기 때문에

save(user=request.user, music_id=music_id)를 해줘야 한다

request.data에는 user가 안담겨있기 때문!

 

class ReviewView(APIView):
    def post(self, request, music_id):
        serializer = ReviewCreateSerializer(data=request.data)
        print(request.data)
        if serializer.is_valid():
            serializer.save(user=request.user, music_id=music_id)
            return Response(serializer.data, status=status.HTTP_200_OK)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

 

이렇게 해주면 된다

 

리뷰 조회를 할 때는 MusicDetailView에서 같이 보여줘야하기 때문에

MusicDetailSerializer에 같이 리뷰를 넣어주자

Serializer에서 역참조로 reviews의 데이터를 넣어줄 것이기 때문에

review의 데이터를 시리얼라이즈 해줄 ReviewSerializer를 먼저 만들자

 

class ReviewSerializer(serializers.ModelSerializer):
    class Meta:
        model = Review
        fields = '__all__'


class MusicDetailSerializer(serializers.ModelSerializer):
    reviews = ReviewSerializer(many=True)
    class Meta:
        model = Music
        fields = '__all__'

 

그러면 같이 잘 넘어온다

 

 

2. 프로필 조회

프로필 조회 페이지에서는

user 정보와 user가 작성한 리뷰와 그 리뷰가 작성된 music의 데이터가 넘어와야한다.

class ProfileView(APIView):
    def get(self, request, username):
        profile = get_object_or_404(User, username=username)
        serializer = ProfileSerializer(profile)      
        return Response(serializer.data, status=status.HTTP_200_OK)
class ProfileSerializer(serializers.ModelSerializer):
    my_reviews = ReviewSerializer(many=True)
    class Meta:
        model = User
        fields = '__all__'
class ReviewSerializer(serializers.ModelSerializer):
    class Meta:
        model = Review
        fields = '__all__'

 

이렇게 작성하면 user 정보와 review 데이터는 넘어오는데

music 데이터가 넘어오지 않는다.

 

 

그래서 MusicSimpleSerializer를 만들어서 

추가로 들어와야하는 music 데이터를 따로 넣어서 추가해주자

class MusicSimpleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Music
        fields = ('id','title','image','artist')
        
class ReviewSerializer(serializers.ModelSerializer):
    music = MusicSimpleSerializer()
    class Meta:
        model = Review
        fields = '__all__'

 

이렇게 하면 아주 잘 들어온다

 

그런데 지금 보면

user가 username이 아니라 id 값으로 들어와있다

user를 username으로 보여주고 싶다! 이건 SerializerMethodField를 사용하면 된다.

 

user = serializers.SerializerMethodField()

def get_user(self, obj):
    return obj.user.username

 

이 코드를 ReviewSerializer에 추가하면 

이렇게 username으로 잘 나오는걸 확인할 수 있다!

 

review를 생성할 때도 값을 넣어주자

그런데

class ReviewCreateSerializer(serializers.ModelSerializer):
    user = serializers.SerializerMethodField()
    user_id = serializers.SerializerMethodField()
    def get_user(self, obj):
        return obj.user.username
    
    def get_user_id(self, obj):
        return obj.user.id

    class Meta:
        model = Review
        fields = '__all__'

 

이렇게 바꿔주면

user와 music은 필수 값이라고 에러가 뜰 것이다

그렇기 때문에 views에서 처음부터 값을 넣어주자

 

request.data.update({'user': request.user.id, 'music': music_id})

이 코드를 post 밑에다 넣어주면 user 값과 music값은 따로 입력하지 않아도 자동으로 입력되는 것!!

 

그러면 리뷰작성할 때 content와 grade만 입력해도 알아서 들어간다!

 

 

 

3. 프로필 수정 페이지

별 문제없이 잘 할 수 있었당

728x90

댓글