Используя логику расстояния из этого поста , я получаю обратно правильно отфильтрованный набор объектов с этим кодом:
class LocationManager(models.Manager):
def nearby_locations(self, latitude, longitude, radius, max_results=100, use_miles=True):
if use_miles:
distance_unit = 3959
else:
distance_unit = 6371
from django.db import connection, transaction
cursor = connection.cursor()
sql = """SELECT id, (%f * acos( cos( radians(%f) ) * cos( radians( latitude ) ) *
cos( radians( longitude ) - radians(%f) ) + sin( radians(%f) ) * sin( radians( latitude ) ) ) )
AS distance FROM locations_location HAVING distance < %d
ORDER BY distance LIMIT 0 , %d;""" % (distance_unit, latitude, longitude, latitude, int(radius), max_results)
cursor.execute(sql)
ids = [row[0] for row in cursor.fetchall()]
return self.filter(id__in=ids)
Проблема в том, что я не могу понять, как сохранить список / набор запросов, отсортированный по значению расстояния. Я не хочу делать это как вызов метода extra () по соображениям производительности (один запрос против одного запроса на каждое потенциальное местоположение в моей базе данных). Пара вопросов:
- Как я могу отсортировать мой список по расстоянию? Даже снимая родную сортировку, которую я определил в моей модели, и используя "order_by ()", она все равно сортируется по чему-то другому (я полагаю, id).
- Я ошибаюсь из-за производительности, и Django оптимизирует запрос, поэтому я должен использовать extra () вместо этого?
- Это абсолютно неправильный способ сделать это, и я должен использовать гео-библиотеку вместо того, чтобы раскатывать это вручную, как путц?