이모티콘 모델과 이모티콘에 사용할 이미지를 다중으로 받기위해 이미지 모델을 따로 만들게 됐다. 이모티콘과 이모티콘 이미지들은 참조-역참조 관계이며 이모티콘 데이터를 프론트로 보내주게 될 때 역참조하는 모델의 데이터를 같이 보내기 위해 serializerMethodField를 사용할 수 있다. 이때 원하는 조건으로 filter를 적용할 수 있다.
공식문서에 따르면 사용법은 다음과 같다.
데이터를 보내 줄 serizlizer에서 사용하고자 하는 field명을 지정한다. MethodField를 사용하기 위해서는 앞에서 지정한 field명을 받는 메서드를 선언해줘야 한다.def get_field명(self, obj): """ 메서드가 동작하는 코드 """ return obj.images
이때 역참조되는 데이터를 모두 사용하고자 하는 경우 위와같이 작성할 수 있다.
이번 프로젝트에서는 데이터 복구요청에 대응할 수 있도록 삭제상태를 나타내는 필드를 가진 CommonModel을 작성, 상속하여 모델제작을 진행했다.
따라서 필드의 값에 따라 데이터를 보내줘야하는 상황이기 때문에 모든 데이터가 아닌 삭제상태가 아닌 값을 보내줘야한다.
MethodField를 사용시 filter적용도 가능하다. 적용 방법은 아래와 같다.# 이모티콘 모델 class Emoticon(CommonModel): creator = models.ForeignKey(User, on_delete=models.SET_NULL, null=True) # User 삭제시 이모티콘은 유지 title = models.CharField("이모티콘 제목", max_length=50)
# 이모티콘 이미지 모델 class EmoticonImages(CommonModel): emoticon = models.ForeignKey(Emoticon, on_delete=models.CASCADE, related_name='images') image = models.ImageField("이미지", upload_to='%Y/%m/', blank=True, default=None)
# 이모티콘 시리얼라이저 class EmoticonSerializer(serializers.ModelSerializer): images = serializers.SerializerMethodField() ... class Meta: model = Emoticon fields = "__all__" ... def get_images(self, emoticon): qs = EmoticonImages.objects.filter(db_status=1, emoticon=emoticon) serializer = EmoticonImagesSerializer(instance=qs, many=True) return serializer.data ...