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. 프로필 수정 페이지
별 문제없이 잘 할 수 있었당
'프로젝트 > 나혼자 프로젝트' 카테고리의 다른 글
Nadle_초기세팅, 모델, 회원가입/로그인, 음원CRUD (0) | 2022.11.16 |
---|---|
sns 만들기 (댓글기능) (0) | 2022.10.09 |
sns 만들기 (게시글 수정) (0) | 2022.10.09 |
sns 만들기(게시글 상세페이지 연결, 보여주기) (0) | 2022.10.09 |
sns 만들기(게시글 삭제) (0) | 2022.10.09 |
댓글