Django django.contrib.gis.db.models.functions.Distance以英尺而不是米为单位返回值

2022-04-17 00:00:00 python python-3.x django django-orm

问题描述

以下代码将正确筛选:

def nearby(self, latitude, longitude, proximity=None):
        """Get nearby Merchants.

        Custom queryset method for getting merchants associated with
        nearby places.

        Returns:
            A queryset of ``Merchant`` objects.

        """
        point = Point(latitude, longitude)

        # we query for location nearby for places first and then
        # annotate with distance to the same place
        return self.filter(
            places__location__distance_lte=(point, D(ft=proximity))
        ).annotate(distance=models.Min(Distance('places__location', point)))

返回的值
models.Min(Distance('places__location', point))

以米为单位。

可以把它放在脚上吗?


解决方案

如果我们查看Distance documentation,我们将看到以下内容:

因为Distance属性是一个距离对象,所以您可以轻松地用您选择的单位来表示该值。

虽然这不是entirely true:

这两者之间的关系并不密切。Docs确实说它"返回"距离对象,但还有一个额外的步骤:

django.contrib.gis.db.models.functions.Distance是一个数据库函数,它接受两个表达式(可能包括数据库字段名),并返回一个可用作查询一部分的Func对象。

简单地说,它需要在数据库中执行。它将使用数据库函数(例如postgis ST_Distance)计算距离,然后将其作为django.contrib.gis.measure.Distance对象带回


综上所述,您可以这样做:

... .annotate(distance=models.Min(Distance('places__location', point).ft))

相关文章