【问题标题】:Django Filtering using distance_lte and Foreign Key使用 distance_lte 和外键进行 Django 过滤
【发布时间】:2013-10-25 00:04:33
【问题描述】:

我想使用 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)))

感谢您的任何想法!

【问题讨论】:

  • 你是从 django.contrib.gis.db 继承你的模型吗?如果没有,您应该这样做。
  • 我刚刚意识到我同时导入了django.db.modelsdjango.contrib.gis.db.models。但是,在删除 django.db.models 导入后,我仍然从该查询中得到相同的结果:z = Thing.objects.filter(point__distance_lte=(pnt,D(km=5))) TypeError: Related Field has invalid lookup: distance_lte。还有什么我可能会错过的吗?感谢您的想法!
  • 然后你已经重置了数据库中的所有模型?
  • 我尝试使用 South 运行架构迁移,但它说没有任何改变。我需要转储并重新创建数据库吗?
  • 如果它不繁重,我会的。只是为了消除这种可能性。另外,您的 Point 模型是地理模型的子类吗?该模型需要。

标签: django filter distance geodjango django-queryset


【解决方案1】:

使用 GeoManager 是必要的,但还不够。必须告知数据库字段包含空间数据(包括要使用的坐标系),以便它可以在查询时解释该数据,适当地对其进行索引等。对于 PostGIS,它通过通过 @ 添加这些列来做到这一点987654321@。您的代码仅在数据库中创建浮点字段。

因此,您最简单的方法是将PointField 添加到您的Point 模型中,在这种情况下,您的查找可能看起来更像point__point__distance_lte,或者直接添加到Thing 模型中来代替ForeignKey 字段(可能如果您仍想单独存储 lat/long,请重命名此字段)。

【讨论】:

  • 感谢@Steven 提供的信息。如果我只使用PointField,有没有办法解包纬度和经度值以单独使用它们?
  • @NickB 我相信您可以从as described here 字段中检索它们。您也许还可以分别使用 point.x 和 point.y 表示经度和纬度。
猜你喜欢
  • 2020-09-07
  • 2012-01-23
  • 1970-01-01
  • 2015-03-27
  • 2021-09-04
  • 2014-09-11
  • 2018-03-04
  • 2018-01-05
  • 2013-09-05
相关资源
最近更新 更多