python - 在 field_name 中指定反向关系时,GeoDjango GeoQuerySet.distance() 结果为 'ST_Distance output only available on GeometryFields'

标签 python django django-models postgis geodjango

根据文档和其他问题,按距离对 GeoQuerySet 进行排序应该很简单,但我无法让它正常工作。下面举例说明问题的情况:

假设我在两个不同的应用程序中有两个模型。 appA 中的一个模型和 appB 中的另一个模型定义如下:

# appA/models.py
class Store(models.Model):
        title = models.CharField()


# appB/models.py
from appA.models import Store

class StoreLocation(models.Model):
    store = models.ForiegnKey(Store)
    location = models.PointField()

现在,我想获取用户位置 (user_location) 两英里范围内的所有 Stores,如下所示:

stores = Store.objects.filter(storelocation__location__dwithin(user_location, D(mi=2))

到目前为止一切顺利。到这里为止的一切都有效。当我现在想根据到 user_location 的距离对 Stores 进行排序时,问题就开始了:

stores = Store.objects.filter(storelocation__location__dwithin(user_location, D(mi=2))\
         .distance(user_loc, field_name='storelocation__location')\
         .order_by('distance')

这会导致 TypeError:ST_Distance 输出仅在 GeometryFields 上可用

StoreLocation 模型的location 字段是一个PointField,它是一个GeometryField。所以问题在于 field_name='storelocation__location' 完成的反向关系查找。

有一张 Django 支持票证 (https://code.djangoproject.com/ticket/22352) 请求支持在 field_name 中为 OneToOne 关系进行反向关系查找,但我的模型通过 ForeignKey 具有 OneToMany 关系,所以我不确定是否支持票适用于此问题。

从 Django 文档 (https://docs.djangoproject.com/en/1.6/ref/contrib/gis/geoquerysets/#geoqueryset-methods) 来看,我似乎没有滥用任何东西。

GeoQuerySet 方法的 field_name 参数是否允许反向关系查找?还是我只是做错了什么?

这个问题 ( GeoDjango distance query for a ForeignKey Relationship ) 中提供的解决方案也没有帮助。

最佳答案

我怀疑您遇到了 Django support ticket 22352 中提到的相同问题,因为相关字段(无论是一对一还是一对多)共享大部分相同的代码。

您仍然可以高效地按距离订购附近的商店:

locations = StoreLocation.objects.filter(location__dwithin=(user_location, D(mi=2)))
locations = locations.distance(user_location).order_by('distance')
stores = [sl.store for sl in locations.select_related('store')]

但是,这失去了将 stores 作为查询集(可以进一步过滤、切片等)的好处。

关于python - 在 field_name 中指定反向关系时,GeoDjango GeoQuerySet.distance() 结果为 'ST_Distance output only available on GeometryFields',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25047964/

相关文章:

python - django 项目中两个应用程序之间的导入

python - Django 1.9 在列表中查找属性等于某个值的对象

django - 多个模型保存在一个 POST 请求中。 (无效数据。需要字典,但得到了列表。)

python - Django Sql Server 配置不正确 - settings.DATABASES

python - python mplot3D 中的 2D 图与 3D 轴壁不齐平

django - 使用基于类的 View 将模板的一部分限制为属于组的用户的访问权限。 Django 2.0

python - Django ORM 查询性能

python - Mechanize - 如何根据相邻标签选择链接?

python - 在常规回调中调用异步代码的正确方法是什么?

django - 使用Django和lighttpd提供文件