[Project] Threepark

[Capstone Design] 3. 백엔드 구현 - (5) DRF 개발 | SERIALIZER

mingyung 2024. 5. 21. 14:39

모델 작성을 완료 후 시리얼라이저를 작성하도록 한다.

 

시리얼라이저의 경우 민감한 데이터가 없는경우 대체로 all로 작성하였으며, 특수한 경우인 community와 diary만 살펴본다.

 

Diary

일기의 경우 크게 일기 내용과, 일기내용을 바탕으로 생성된 음악, 이미지, 감정 데이터로 크게 나눠볼 수 있다. 

이중 음악의 경우는 diary모델에서 fk로 참조하기 때문에, 음악 데이터를 생성하고, 일기와 연결하는 부분은 따로 구성했다.

따라서 시리얼라이저는 다음과 같다.

1. 순수하게 일기를 작성할 수 있게 하고, 다른 연관 데이터는 only read로 읽을수만 있도록 하는 DiarySerializer

2. 일기 내용을 토대로 음악을 추천하고, 음악-일기를 연결할 수 있도록 하는 DiaryMusicSerializer

 

DiarySerializer

class DiarySerializer(serializers.ModelSerializer):
    music = MusicSerializer(required=False)
    image_set = ImageSerializer(many=True, read_only=True)
    emotion_set = EmotionSerializer(many=True, read_only=True)
    
    class Meta:
        model = Diary
        fields = ['id','user','title','content','registered_at','last_update_at','music','is_open','image_set','emotion_set']

 

DiaryMusicSerializer

class DiaryMusicSerializer(serializers.ModelSerializer):
    music = MusicSerializer(required=False)
    
    class Meta:
        model = Diary
        fields =['id', 'user', 'content', 'music']
        
    def update(self, instance, validated_data):
        music_data = validated_data.pop('music', None)
        instance = super().update(instance, validated_data)
        
        if music_data:
            music, _ = Music.objects.get_or_create(**music_data)
            instance.music = music
        
        return instance

 

Community

커뮤니티의 경우 서로 팔로우가 허용된 관계의 유저 일기 중 공개된 것들을 조회할 수 있도록 한다.

 

CommunitySerializer

class CommunitySerializer(serializers.ModelSerializer):
    user = UserSerializer(required = False)
    music = MusicSerializer(required=False)
    image_set = ImageSerializer(many=True, read_only=True)
    
    class Meta:
        model = Diary
        fields = ['id','user','title','content','music','image_set','registered_at','last_update_at', 'is_open']

 

여기에 팔로우 정보가 없는데요? > 이부분은 후에 permissions를 통해 가능하게 한다.