Упорядочивание на основе расстояния в django

Я использую django и получаю местоположение пользователя во время регистрации.

Затем я показываю этих пользователей на первой странице приложения, но сортирую их по расстоянию, т.е. ближайшие к вошедшему пользователю находятся сверху и так далее.

Теперь я упорядочиваю их в соответствии с расстоянием на бэкенде, используя некоторые функции annotate (etc), предоставляемые django ORM.

sortedQueryset = self.get_queryset().annotate(distance=Distance(
                'coords', user.coords, spheroid=True)).order_by('distance')

Где 'coords' - столбец в db для хранения точки (местоположения), user.coords - точка (координаты) вошедшего в систему пользователя.

Теперь, чтобы получить только первые 100 пользователей (скажем) из базы данных, я могу сделать что-то вроде этого;

sortedQueryset = self.get_queryset().annotate(distance=Distance(
                'coords', user.coords, spheroid=True)).order_by('distance')[:100]

Но что бы он ни думал, он все равно берет все строки, упорядочивает их по расстоянию и затем получает 100 из них. Скажем, у нас есть миллион пользователей в базе данных, тогда ему всегда нужно получить всех этих пользователей, затем отсортировать их и затем получить только 100.

Я думаю, что это большая перегрузка (возможно, я ошибаюсь или это единственный способ, поскольку я должен сортировать по расстоянию, и это также зависит от зарегистрированного пользователя, кто ближе, а кто дальше).

Любые предложения будут приняты с благодарностью. Спасибо!

На самом деле правильно только то, что вы сделали. Это не нарезка в Python, а ограничение в самом запросе к базе данных. Поэтому он не будет получать все результаты и нарезать их, вместо этого он выполняет LIMIT запрос к базе данных. См. документацию

https://docs.djangoproject.com/en/dev/topics/db/queries/#limiting-querysets

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