-
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)
그리고 새로운 항목을 추가하였으면 꼭 필즈에 넣어주자!
▷ 오늘의 한줄
'TIL(Today I Learned)' 카테고리의 다른 글
6월 26일 TIL - 장고 어드민 커스터마이징 (0) 2023.06.26 6월 23일 TIL - 중간발표 준비 (0) 2023.06.25 6월 21일 TIL - 테스트 코드 수정 및 추가 (0) 2023.06.21 6월 20일 TIL - 키워드 추출 어떻게 하지 (0) 2023.06.20 6월 19일 TIL - 스케쥴러 (0) 2023.06.19