[Django] GET View에서 값 처리

채린·2023년 9월 1일

Audio Detail api

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

0개의 댓글