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.

Вернуться на верх