[python] Django REST framework에서의 위치 기반 검색 처리 방법

Django REST framework을 사용하여 위치 기반 검색을 처리하는 방법에 대해 알아보겠습니다.

1. 위치 정보 모델 생성하기

먼저, 위치 정보를 저장할 모델을 생성해야 합니다. Django의 models.py 파일에 다음과 같은 모델을 추가합니다.

from django.db import models

class Location(models.Model):
    name = models.CharField(max_length=100)
    latitude = models.FloatField()
    longitude = models.FloatField()

위 예시에서는 name, latitude, longitude 필드를 가진 Location 모델을 생성했습니다. latitudelongitude는 각각 위도와 경도를 저장하는 필드입니다.

2. Serializer 작성하기

위치 정보를 시리얼라이즈하기 위해 Django REST framework의 Serializer를 사용합니다. serializers.py 파일에 다음과 같은 Serializer를 작성합니다.

from rest_framework import serializers
from .models import Location

class LocationSerializer(serializers.ModelSerializer):
    class Meta:
        model = Location
        fields = '__all__'

위 코드에서는 Location 모델을 시리얼라이즈하기 위한 Serializer를 작성하였습니다. Meta 클래스의 model 변수에 Location 모델을 할당하고, fields 변수에는 시리얼라이즈할 필드를 모두 포함하도록 설정했습니다.

3. 위치 기반 검색 API 구현하기

이제 위치 기반 검색을 처리하기 위한 API를 구현해보겠습니다. views.py 파일에 다음과 같은 ViewSet을 작성합니다.

from rest_framework import viewsets
from django.contrib.gis.geos import Point
from django.contrib.gis.db.models.functions import Distance
from .models import Location
from .serializers import LocationSerializer

class LocationViewSet(viewsets.ModelViewSet):
    queryset = Location.objects.all()
    serializer_class = LocationSerializer

    def get_queryset(self):
        latitude = self.request.query_params.get('latitude', None)
        longitude = self.request.query_params.get('longitude', None)
        distance = self.request.query_params.get('distance', None)

        if latitude and longitude and distance:
            user_location = Point(float(longitude), float(latitude))
            queryset = Location.objects.annotate(
                distance=Distance('coordinates', user_location)
            ).filter(distance__lte=distance).order_by('distance')
        else:
            queryset = Location.objects.all()

        return queryset

위 코드에서는 Location 모델의 쿼리셋을 정의하고, 위치 기반 검색을 위한 필터링을 구현했습니다. latitude, longitude, distance는 URL 쿼리 파라미터로 받아옵니다. 해당 파라미터들이 존재하면, 사용자의 위치를 기준으로 주변 거리 내의 위치 정보만 필터링하여 반환합니다.

4. URL 설정하기

마지막으로, 위에서 작성한 ViewSet을 URL에 연결해야 합니다. Django 프로젝트의 urls.py 파일에 다음과 같이 작성합니다.

from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import LocationViewSet

router = DefaultRouter()
router.register(r'locations', LocationViewSet)

urlpatterns = [
    path('', include(router.urls)),
]

위 예시에서는 /locations URL에 LocationViewSet을 연결하였습니다. 이제 API를 통해 위치 정보를 검색할 수 있는 기능이 구현되었습니다.

결론

이제 Django REST framework를 사용하여 위치 기반 검색을 처리하는 방법에 대해 알아보았습니다. 위 예시를 참고하여 자신의 프로젝트에 위치 기반 검색 기능을 추가해보세요. 추가적인 기능이나 설정은 Django REST framework의 공식 문서를 참조하시기 바랍니다.

참고 자료