ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 6월 22일 TIL - 내 위치 기준 거리 검색
    TIL(Today I Learned) 2023. 6. 23. 09:18

    ▷ 오늘의 시도

    내 위치를 기준으로 주변 정보를 가져오는 코드는 반경 2km로 설정되어 있었다. 2km가 생각보다 가까운 거리여서 이용자가 직접 범위를 설정할 수 있도록 하고자 하였다. 우선 2, 5, 10km를 선택하여 찾아볼 수 있도록 코드를 작성하였다. 쿼리로 거리값을 받은 다음 불러올 데이터를 필터링할 계산식에 추가해 주었다. 

    # 쿼리로 받아온 현재 위치의 위,경도 그리고 찾고자 하는 거리
    lat = float(self.request.query_params.get("lat", ""))
    lon = float(self.request.query_params.get("lon", ""))
    dist = float(self.request.query_params.get("dist", ""))
    # 내위치 좌표
    position = (lat, lon)
    
    # 필터링 조건, 위도는 0.01이 약 1km, 경도는 0.015가 약 1km이다.
    q.add(
                Q(coordinate_y__range=(
                        lat - 0.01 * dist,
                        lat + 0.01 * dist,))
                | Q(coordinate_x__range=(
                        lon - 0.015 * dist,
                        lon + 0.015 * dist,)))

    그리고 주변 데이터를 가져올 때 게시글을 역참조 하여 같이 불러왔었다. 그런데 삭제 상태인 게시글도 함께 불러와져서 시리얼라이저를 수정해 주었다.

    # 수정전
    class MapSearchSerializer(serializers.ModelSerializer):
        """지도정보 db저장"""
    
        score_avg = serializers.SerializerMethodField()
        articles_set = ArticleSerializer(many=True, read_only=True)
    
        def get_score_avg(self, obj):
            avg = obj.article_set.aggregate(Avg("score"))
            return avg["score__avg"]
    
        class Meta:
            model = MapDataBase
            fields = (
                "jibun_address",
                "road_address",
                "coordinate_x",
                "coordinate_y",
                "id",
                "articles_set",
                "score_avg",
            )
    
        def create(self, validated_data):
            return MapDataBase.objects.create(**validated_data)
     
    # 수정후
    class MapSearchSerializer(serializers.ModelSerializer):
        """지도정보 db저장"""
    
        score_avg = serializers.SerializerMethodField()
        articles = serializers.SerializerMethodField()
    
        def get_articles(self, obj):
            qs = obj.article_set.filter(db_status=1)
            serializer = ArticleSerializer(instance=qs, many=True, read_only=True)
            return serializer.data
    
        def get_score_avg(self, obj):
            avg = obj.article_set.aggregate(Avg("score"))
            return avg["score__avg"]
    
        class Meta:
            model = MapDataBase
            fields = (
                "jibun_address",
                "road_address",
                "coordinate_x",
                "coordinate_y",
                "id",
                "articles",
                "score_avg",
            )
    
        def create(self, validated_data):
            return MapDataBase.objects.create(**validated_data)

    그리고 새로운 항목을 추가하였으면 꼭 필즈에 넣어주자!

     

    ▷ 오늘의 한줄

    댓글

Designed by Tistory.