Упорядочивание на основе расстояния в 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