Django orm, annotate + сторонние данные
До этого использовал в сериализаторе SerializerMethodField, который отображал дистанцию. Но по этому методу я не мог делать фильтрацию относительно расстояния.
Решил использовать annotate во views, чтобы вычислить растояние относительно пользователя, который сделал запрос.
from django.db.models.functions import ACos, Cos, Sin, Radians
def get_queryset(self):
request_user = self.request.user.geolocation
self_latitude = Radians(request_user.latitude)
self_longitude = Radians(request_user.longitude)
latitude = Radians('geolocation__latitude')
longitude = Radians('geolocation__longitude')
return User.objects.annotate(distance=
(6371 * ACos(Sin(self_latitude) * Sin(latitude) + Cos(self_latitude
) * Cos(longitude) * Cos(self_longitude - longitude)))
)
django.db.utils.OperationalError: user-defined function raised exception
К сожалению данный запрос не коректен. Начинается валиться, как только я добавляю стороние данные пользователя, который делал запрос.
Уже не первый день, не могу найти примеров правильной реализации, либо примеров написания annotate
Модель где хранятся значений широты и долготы.
class Geolocation(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE,
related_name='geolocation', verbose_name='пользователь')
latitude = models.DecimalField(max_digits=11, decimal_places=8,
verbose_name='Широта')
longitude = models.DecimalField(max_digits=11, decimal_places=8,
verbose_name='Долгота')
Как это правильно можно реализовать этот метод? Чтобы в апи отображалась дистанция + фильтрация по дистанции с использованием Django-filters.