Мне нужно преобразовать координаты местоположения в расстояние и затем соответствующим образом отфильтровать набор запросов с помощью django-filter
Далее следует соответствующий код:
Models.py
class RentTypeChoices(models.IntegerChoices):
DAILY = 0
HOURLY = 1
MONTHLY = 2
rent_type = models.PositiveSmallIntegerField(
choices=RentTypeChoices.choices)
title = models.CharField(max_length=256)
available_from = models.DateField(default=datetime.date.today)
category = models.ForeignKey(
Category, related_name="rent_posts", on_delete=models.CASCADE)
price = models.DecimalField(decimal_places=2, max_digits=6)
# Need to convert below location coords to distance
latitude = models.CharField(max_length=120)
longitude = models.CharField(max_length=120)
is_available = models.BooleanField(default=True)
Filters.py
from django_filters import rest_framework as filters
from apps.embla_services.models import RentPost
class RentPostFilters(filters.FilterSet):
title = filters.CharFilter(lookup_expr="icontains")
is_available = filters.BooleanFilter()
rent_type = filters.ChoiceFilter(choices=RentPost.RentTypeChoices.choices)
category__id = filters.NumberFilter()
available_from = filters.DateFromToRangeFilter()
price = filters.RangeFilter()
# i need to filter this model by distance also
# search query would contain the min or the maximum distance and i would need to filter
# accordingly
class Meta:
model = RentPost
fields = ["title", "is_available",
"rent_type", "category", "available_from", "price"]
Views.py
from django_filters import rest_framework as filters
from apps.embla_services.models import RentPost
from apps.embla_services.filters import RentPostFilters
class SearchRentPosts(generics.ListAPIView):
queryset = RentPost.objects.all()
serializer_class = RentPostBriefSerializer
filter_backends = (filters.DjangoFilterBackend,)
filterset_class = RentPostFilters
я знаю, как преобразовать координаты местоположения между двумя точками, используя этот пост Getting distance between two points based on latitude/longitude. однако как именно использовать эти знания для фильтрации координат местоположения, чтобы получить расстояние - моя проблема.
следующий пример поискового запроса со стороны клиента
{{baseUrl}}/rent/search-posts?title=k&rent_type=0&category=14&available_from_after=2022-04-`26&available_from_before=2022-10-05&price_min=40.00&price_max=45.00&distance_max = 5&distance_min=1`
все остальное выполняется отлично, единственная проблема - это расстояние. клиенту нужно отфильтровать результаты поиска по расстоянию между его текущим местоположением и местоположением пункта аренды. мы получаем координаты местоположения клиента, и у нас также сохраняются координаты местоположения пункта аренды
Надеюсь, я хорошо объяснил свой вопрос.
Ps. Я не добавил код сериализатора, так как он не требуется в этом посте.