使用此 SO post中的距离逻辑,我将使用以下代码返回一组经过适当过滤的对象:
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() 代替吗?
- 这是完全错误的方法吗?我应该使用地理库而不是像putz一样手动滚动它?