Django使用distance_lte和外键过滤

时间:2013-10-16 18:17:09

标签: django filter distance geodjango django-queryset

我想使用Geodjango使用distance_lte过滤由纬度和经度值组成的Point对象。以下是我设置模型的方法:

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)))

感谢您的任何想法!

1 个答案:

答案 0 :(得分:1)

使用GeoManager是必要的但不充分。必须告知数据库一个字段包含空间数据(包括要使用的坐标系统),以便它可以在查询时解释该数据,对其进行适当索引等。对于PostGIS,它通过{添加这些列来实现这一点。 {3}}。您的代码只在数据库中创建浮点字段。

因此,您最简单的方法是向Point模型添加AddGeometryColumn stored procedure,在这种情况下,您的查找可能看起来更像point__point__distance_lte或直接发送到Thing模型取代ForeignKey字段(如果您仍想单独存储lat / long,则可能会重命名此字段)。

相关问题