運用this SO post的距離邏輯,我又回到這個代碼適當過濾的一組對象: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)
問題是我無法弄清楚如何保持按距離值排序的列表/查詢集。我不希望將其作爲額外的()方法調用,因爲性能方面的原因(在數據庫中每個潛在位置上的一個查詢與一個查詢)。幾個問題:
- 如何根據距離對我的列表進行排序?即使脫掉我在模型中定義的本地排序,並使用「order_by()」,它仍然按其他內容排序(id,我相信)。
- 我錯了關於性能的事情,Django會優化查詢,所以我應該使用extra()來代替?
- 這是完全錯誤的方式來做到這一點,我應該使用地理庫,而不是像putz手動滾動?
謝謝,這就是我所想的。如果我可以再次濫用你的善良本性:我以前做過#2,我只是覺得很骯髒。無論如何,只要建立一個查詢集對象,並按照我想要的順序將這些對象粘貼到它中?我現在要去2或3(網站今晚/明天啓動),但我想知道這是否可能。 – Tom
可能嗎?當然。簡單或簡單或乾淨?不,沒有理由這樣做。如果你現在需要一個骯髒的黑客,使用#2或#3。無論如何,稍後右側選項是#1或GeoDjango。 –