api명세서 쓸때 시리얼라이저 고려 안해도 된다.
point) 각 시리얼라이저에서 각각 데이터 가져오고 data형태 맞게 만든다
views.py
class AudioDetailView(views.APIView):
def get(self, request, audio_pk, playlist_pk):
# 오디오
audio = get_object_or_404(Audio, audio_id=audio_pk)
serializer = AudioDetailSerializer(audio)
# 포스트 섹션
postsecs=PostSec.objects.filter(sec_post=audio.audio_post).all()
postsecseri=PostSecInAudioSerializer(postsecs, many=True)**.data**
# 오디오 섹션
audiosecs=AudioSec.objects.filter(audiosec_audio=audio)
audiosecseri=AudioSecInAudioSerializer(audiosecs, many=True)**.data**
data={
"audio_id":serializer.data['audio_id'],
"audio_post": serializer.data['audio_post'],
"PostSec":postsecseri,
"AudioSec":audiosecseri
}
return Response({'message': '오디오북 상세 조회 성공', 'data': data}, status=status.HTTP_200_OK)
serializers.py
from rest_framework import serializers
from django.shortcuts import render,get_object_or_404
from .models import *
from post.models import Post, PostSec
from mypage.serializers import InterestSerializer
class PostInAudioSerializer(serializers.ModelSerializer):
hashtag=InterestSerializer(many=True, read_only=True)
class Meta:
model=Post
fields=['post_id','post_user','title','diff','hashtag']
class PostSecInAudioSerializer(serializers.ModelSerializer):
class Meta:
model=PostSec
fields=['sec_id','num','title','content']
class AudioSecInAudioSerializer(serializers.ModelSerializer):
class Meta:
model=AudioSec
fields=['audiosec_id','num','audiofile']
class AudioDetailSerializer(serializers.ModelSerializer):
audio_post=PostInAudioSerializer(read_only=True)
class Meta:
model=Audio
fields=['audio_id','audio_post']
시리얼라이저에서 오디오의 audio_post를 sec_post로 가지는 PostSec을 가져오려 하니까 너무 어려웠다
위처럼 시리얼라이저는 간단하게 쓰고 view에서 처리하는 것이 더 맞는 방법 같다
필터링, 객체 찾는건 view에서 하고, 시리얼라이저를 view마지막부분에서 합치는 방법! :0