티스토리 뷰

Django

[DRF] Serializer에 context 추가하기

angieveloper 2022. 4. 26. 22:24

쿼리를 통해 여러 데이터를 불러오고 serializer로 데이터를 직렬화했을 때..

데이터베이스에 저장된 정적인 값을 그대로 가져오는 것 외에 request로 받은 쿼리들과 어떤 작업을 해서 새로운 동적인 데이터를 가져오고 싶을 때가 있다

가령 현재 위치의 위도, 경도와 데이터베이스에 저장된 장소의 위도, 경도 값을 계산해서 거리를 계산한다던가 등등

어떤 필드에 대해서 각각 데이터에 어떠한 작업을 해준 뒤 응답으로 보내줘야하는 경우가 있다.

for문을 통해서 하나하나할 수도 있겠지만! Serializer에서 바로 처리해줄 수 있는 context가 있다.

 


 

아래는 request의 GET query로 현재 위치의 위도, 경도 값을 요청 받았을 때, 데이터베이스에 저장되어 있는 장소들과의 거리를 구하고 그 거리를 기준으로 정렬하는 경우의 코드이다.

# views.py
class RestaurantApi(APIView):
    def get(self, request):
        serializer = RestaurantListSerializer(context={"request": request})

먼저 views.py의 코드이다.

여타 불필요한 코드들은 제외하고 필요한 코드만 적어두었다.

중요한 것은 Serializer에 context={"request":request} 로 request로 받은 데이터들을 매개변수로 넘기는 것이다.

 

# serializer.py
class RestaurantListSerializer(serializers.ModelSerializer):
    distance = serializers.SerializerMethodField(read_only=True)

    def get_distance(self, obj):
        request_params = self.context.get("request").GET
        latitude = request_params.get('latitude')
        longitude = request_params.get('longitude')
        distance = get_distance_between_two_place(obj.lat, obj.lng, latitude, longitue)
        return distance

    class Meta:
        model = Restaurant
        ordering = ['distance']
        fields = [
            #...(생략)...
            'distance',
            ]

serializer.py의 코드이다.

 

(1) distance 필드 생성

먼저 distance라는, 데이터베이스에는 저장되어 있지 않지만 현재 위치와의 거리를 계산해서 보내주는 필드를 만들어 준다.

따라서 SerializerMethodField를 통해 distance라는 필드를 만들어주었다.

 

(2) request의 매개변수들 받기

앞 views.py의 RestaurantApi에서 context로 넘겨준 request 값을 받기 위해서 아래와 같은 코드를 작성한다.

request_params = self.context.get("request")

그리고 우리는 이 중에서도 query 값을 이용할 것이므로 .GET을 붙여준다.

request_params 는 JSON 형태이므로 .get()을 이용해 원하는 값에 접근한다.

 

(3) 메타 데이터에 distance 추가

distance에서 출력해주고자 하는 값을 return 해준다.

Meta 클래스에서 fieldsdistance를 꼭 추가하고!! 거리순으로 정렬하고자 하므로 ordering에도 추가해주었다.

 


참고

https://www.django-rest-framework.org/api-guide/serializers/#including-extra-context

 

Serializers - Django REST framework

 

www.django-rest-framework.org

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함