Django REST Framework에서 model을 정의하고 Serializer, ViewSet, Router 만 간단히 구현하면 REST API를 편리하게 이용할 수 있다. Meeting에 대한 REST API가 구현돼 있고 SubImage 라는 model과 OneToMany 관계를 가지고 있다. 이 때, Meeting에 대한 API를 호출하면 연관된 SubImage 정보까지 같이 반환되도록 하는 Serializer를 추가하는 방법에 대해서 다룬다.


Example

models.py

class Meeting(models.Model):
    title = models.CharField(max_length=30)
    place = models.CharField(max_length=30)
    # ...

class SubImage(models.Model):
    path = models.ImageField(default=SAVED_MEETING_DEFAULT_IMAGE_NAME)
    meeting = models.ForeignKey('Meeting', related_name='sub_images', on_delete=models.CASCADE, blank=True)

Meeting model에 대한 REST API가 구현이 돼 있고 SubImage model에서 Meeting을 외래키로 참조하는 OneToMany 관계를 맺고있다.


Serializer

class MeetingSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Meeting
        fields = ('title', 'place', ...)

MeetingSerializer가 구현돼 있을 때, Meeting API를 호출했을 때 SubImage에 대한 정보도 같이 출력되도록 하려면 아래와 같이 SubImageSerializer를 구현하고 추가해주면 된다.

class SubImageSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = SubImage
        fields = ('path', 'meeting')


class MeetingSerializer(serializers.HyperlinkedModelSerializer):
    sub_images = SubImageSerializer(many=True, read_only=True)

    class Meta:
        model = Meeting
        fields = ('title', 'place', 'sub_images', ...)

Result

http://localhost:8000/meetings/1/ GET Request

{
    "title": "test title",
    "place": "test place",
    "sub_images": [
        {
            "path": "http://localhost:8000/media/favicon_JOkdl66.png",
            "meeting": "http://localhost:8000/meetings/1/"
        },
        {
            "path": "http://localhost:8000/media/favicon_DWdw3cH.png",
            "meeting": "http://localhost:8000/meetings/1/"
        }
    ]
}

JPA Composite key(복합키)를 foreign key(외래키)로 사용하기

이전 포스트 JPA 다대다 관계 모델 @OneToMany로 구현하여 Column 추가하기(@IdClass 사용) 에서 두 테이블의 관계테이블을 구현하는데 @IdClass를 이용해서 두 테이블의 id를 Composite Key(복합키)로 지정했...… Continue reading