2013-10-16 123 views
1

我想使用Geodjango來使用distance_lte過濾由緯度和經度值構成的Point對象。下面是我如何設置我的模型:Django使用distance_lte和外鍵過濾

class Point(models.Model): 
    latitude = models.FloatField() 
    longitude = models.FloatField() 
    objects = models.GeoManager() 

class Thing(models.Model): 
    point = models.ForeignKey(Point) 
    objects = models.GeoManager() 

我試圖篩選這樣,但並未奏效:

>>> from myapp.models import Thing, Point 
>>> from django.contrib.gis.measure import D 
>>> pnt = Point(37.7725205498, -122.408472587) 
>>> z = Thing.objects.filter(point__distance_lte=(pnt,D(km=5))) 
TypeError: Related Field has invalid lookup: distance_lte 

我怎麼做這樣的事? :

>>> z = Thing.objects.filter(point__distance_lte=(pnt,D(km=5))) 
      ### or ### 
>>> z = Thing.objects.filter(point__(latitude_longitude)__distance_lte=(pnt,D(km=5))) 

感謝您的任何想法!

+0

您是從django.contrib.gis.db繼承模型的嗎?如果沒有,你應該。 – professorDante

+0

我剛剛意識到我導入了'django.db.models'和'django.contrib.gis.db.models'。但是,在刪除'django.db.models'後,我仍然從這個查詢得到相同的結果:'z = Thing.objects.filter(point__distance_lte =(pnt,D(km = 5))) TypeError:Related Field有無效的查找:distance_lte'。還有什麼我可能會失蹤?感謝您的想法! –

+0

你做完之後你已經重新設置了數據庫中的所有模型? – professorDante

回答

1

這是必要的,但不足以使用GeoManager。必須告訴數據庫一個字段包含空間數據(包括要使用的座標系),以便它可以在查詢時解釋這些數據,並對其進行適當的索引等。對於PostGIS,它通過添加這些列來實現這一點:AddGeometryColumn stored procedure 。你的代碼只是在數據庫中創建浮動域。

因此你的最簡單的方法是將PointField,要麼添加到您的Point模型在這種情況下,你的查找可能看起來更像point__point__distance_lte或直接代替ForeignKey的領域的Thing模型(可能重命名這個領域,而不是如果你仍然要分別存儲緯度/經度)。

+0

感謝@Steven的信息。如果我只是使用'PointField',是否有解壓緯度和經度值的方法來單獨使用它們? –

+0

@NickB我相信你可以從字段[這裏描述](https://docs.djangoproject。COM/EN /開發/ REF /的contrib/GIS/GEOS /#的幾何形狀,是-Python的)。您也可以分別使用point.x和point.y作爲經度和緯度。 – Steven