20200429 Django와 rest-framework

2020. 4. 29. 17:29개발/Django

  오랫동안 블로그에 글을 쓰지 못했다. 인턴을 하던 회사에서 나와 면접 준비도 하고 면접도 보면서 그런 와중에 학교 수업도 들어 정신이 없었다. 이제 그동안 면접 및 면접 준비를 하며 익힐 수 있었던 것들이 많으니 블로그에 글을 많이 쓰게 될 것 같다. 오늘은 장고와 rest-api를 활용하여 백엔드를 구성하는 대략적인 정석(?)을 깨우친 것들을 써보겠다. 

 

  Django를 배우면 항상 강조되는 개념이 있다. Model - View - Template의 MVT구조가 그것이다. 그리고 이것을 rest api와 serializer를 활용하여 좀 더 효율적이고 다양하게 많은 view를 제공해줄 수 있다. serializer는 정의한 model에서 attribute를 추출하여 json 형태로 편하게 output을 낼 수 있도록 도와준다. (아 근데 꼭 model에 대한 attribute가 아니어도 된다! json으로 표현하고 싶은 모든 것을 다 serializer로 하면된다~) 다음과 같은 예를 보자.

class What(models.Model):
    attr1 = models.IntegerField(default=60)
    attr2 = models.FloatField(default=4.45)
    attr3 = models.FloatField(default=0.45)

 

우선 위와 같이 score라는 model을 정의하였다. 브라우저에서 위의 nodule, consolidation, ptx에 대해서만 request를 받도록 하려면 어떻게 해야하나? 그리고 response는 어떻게 해야하나? 다음과 같이 한다.

 

class WhatSerializer(serializers.ModelSerializer):
    class Meta:
        model = Score
        fields = ('attr1', 'attr2', 'attr3')

    def to_representation(self, instance):
        attr_dict = {}
        response = super().to_representation(instance)
        attr_dict['score'] = dict(response)
        return OrderedDict(attr_dict)

 

request에서 attr1, attr2, attr3을 보낼 때 처리를 도와주도록 한다. 그리고 to_representation 함수를 override하여 view에서 response.data를 구할 때에 원하는 형태로 출력되도록 한다. (serializer 소스코드 보면 알 수 있다.)

 

class GetWhatView(BaseView):
    queryset = Prediction.objects.all()
    serializer_class = WhatSerializer

    def get(self, request, pk, raw):
        prediction = Prediction.objects.get(uuid=pk)
        default_score = prediction.get_score()
        attr1, attr2, attr3 = default_score.attr1, default_score.attr2, default_score.attr3
        what, created = What.objects.get_or_create(attr1=attr1, attr2=attr2, attr3=attr3)
        what.save()
        whatSerializer = WhatSerializer(what)
        if whatSerializer.is_valid():
            return Response(whatSerializer.data, status=status.HTTP_200_OK, content_type='application/json')
        else:
            return Response(whatSerializer.errors, status=status.HTTP_404_NOT_FOUND, content_type='application/json')

 

사실 썩 맘에 드는 View는 아니다. 뭔가 위와 같은 형태를 표현할 때 더 간결하고 좋은 방법이 있을 것 같은데, 일단은 저런식으로 해놨다. 이렇게만 알아도 충분히 다양한 view를 디자인할 수 있을 것이다.

'개발 > Django' 카테고리의 다른 글

20200430 - Django login auth  (0) 2020.04.30
20200327 postgresql unnest  (0) 2020.03.27
20200309 django multi db & auto_commit  (0) 2020.03.09
20200308 django bulk update  (0) 2020.03.09
20200306 Django Migration Conflict관련  (0) 2020.03.06