[Django] POST 시리얼라이저.save()

채린·2023년 9월 1일

플레이리스트 만들기 api

request받은거에서 일부는 바로 정보로 입력되고, 일부는 그걸로 연결연결해서 해시태그를 알아내서 또 따로 추가해야해서 어려웠다

title, des는 바로 저장

(playlist_audio 삭제한 Request생성: 삭제 안하고 넘기면 Dict이 넘어왔다고 오류뜸..)
Request=request.data.copy()
Request.pop('playlist_audio')
serializer = NewPlaylistSerializer(data=Request)


playlist_id로는 원래 플리에 접근해서 해시태그 가져오기
base_pli=get_object_or_404(Playlist, playlist_id=request.data['playlist_id'])
base_hashtag=list(base_pli.hashtag.all())

playlist_audio에서는 audio_id들 뽑아내서 Audio객체로 만들어 따로 저장
playlist_audios=request.data['playlist_audio']

첫번째 오디오는 따로 빼서 저장
first_audio_id = playlist_audios[0]['audio_id']
first_audio=get_object_or_404(Audio,audio_id=first_audio_id)


저장 + 아까 안넘긴 데이터 값들 추가..
newpli=serializer.save(mypli_user = request.user,first_audio=first_audio)


해시태그, 포함된 오디오들 저장하기 위해서는
newpli=serializer.save(mypli_user = request.user,first_audio=first_audio)

serializer.save를 새로운 변수로 받고(다른때에는 안받아도됨) newpli.playlist_audio.add(audioA)


views.py

class NewPlaylistView(views.APIView):
    permission_classes = [IsAuthenticated]
    def post(self, request):
        # request에서 playlist_audio 삭제한 Request생성: 삭제 안하고 넘기면 Dict이 넘어왔다고 오류뜸
        Request=request.data.copy()
        Request.pop('playlist_audio')    

        # 오디오들: playlist_audio데이터 뽑아냄
        playlist_audios=request.data['playlist_audio']

        # 첫번째 오디오: playlist_audio데이터의 첫번째 요소를 first_audio로 지정
        first_audio_id = playlist_audios[0]['audio_id']
        first_audio=get_object_or_404(Audio,audio_id=first_audio_id)
       
        # Request에 담긴 데이터로 NewPlaylistSerializer생성
        serializer = NewPlaylistSerializer(data=Request)
        
        # 해시태그: 베이스 플레이리스트에서 hashtag뽑아와서 list로 저장
        base_pli=get_object_or_404(Playlist, playlist_id=request.data['playlist_id'])
        base_hashtag=list(base_pli.hashtag.all())
        
        if serializer.is_valid():
            # 작성자정보(mypli_user)와 첫번째오디오정보(first_audio)를 담아 시리얼라이저 save
            newpli=serializer.save(mypli_user = request.user,first_audio=first_audio)   

            # playlist_audios 필드에 오디오들 추가
            for audios in playlist_audios:
                audio=audios['audio_id']
                audioA, _ = Audio.objects.get_or_create(audio_id=audio)
                newpli.playlist_audio.add(audioA)
            
            # hashtag 필드에 해시태그 추가
            for ht in base_hashtag:
                newpli.hashtag.add(ht)         

            return Response({'message': '나만의 플리 성공', 'data': serializer.data}, status=status.HTTP_200_OK)
        return Response(serializer.errors)

serializers.py

class NewPlaylistSerializer(serializers.ModelSerializer):
    class Meta:
        model=Playlist
        fields=['playlist_id','title','des','is_base','first_audio']

request

{
	"title": "[제목]",
	"des": "[추가 설명]",
	"playlist_id": 14,              
	"playlist_audio": [
			{ "audio_id": 1 },
			{ "audio_id": 2 },
			{ "audio_id": 4 }
	]
}

response

{
  "message": "나만의 플리 성공",
  "data": {
    "playlist_id": 22,
    "title": "[제목]",
    "des": "[추가 설명]",
    "is_base": false,
    "first_audio": 1
  }
}

0개의 댓글