Django Сортировать по рассчитанному полю

Используя логику расстояния отэтот ТАК постЯ получаю обратно правильно отфильтрованный набор объектов с этим кодом:

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 () вместо этого?Это совершенно неправильный способ сделать это, и я должен использовать гео-библиотеку вместо того, чтобы раскатывать это вручную, как путц?

Ответы на вопрос(1)

Ваш ответ на вопрос