python - 按距离对结果进行排序,并获取它们与查询点之间的距离

标签 python django geodjango

我目前使用以下方法按模型的距离对结果进行排序:

views.py

    SearchPoint = Point(long, lat)    
    res = Model.objects.filter(location__distance_lte=(SearchPoint, D(m=2000)))
               .annotate(distance=Distance('location', SearchPoint))
               .order_by('distance')

这使我能够按距离对 2000 米以内的结果进行排序。

现在我还想显示 SearchPoint 给出的搜索者与我的 Model 结果之间的距离。

模型.py 在我的模型类中,我定义了以下属性:

@property
def distance_to_searcher(self):
    distance =self.location.distance(SearchPoint)
    return distance * 100

但我收到以下错误:

name 'SearchPoint' is not defined

我知道这是没有定义的,因为它是在 views.py 文件中定义的,这是一个 GET 请求,从 URL 中获取 long 和 lat 参数并将它们放入 Point 中() 类。

理想情况下,我会将距离四舍五入到一个合适的数字。

编辑:我在views.py

中定义了SearchPoint
def get_context_data(self, **kwargs):
    if self.request.method == 'GET':
        form = LocationForm(self.request.GET)
        if form.is_valid():
            SearchPoint=Point(form.cleaned_data['Lng'],form.cleaned_data['Lat'])
        else:
            form = LocationForm()
            SearchPoint=Point(0,0)

最佳答案

由于您正在创建此查询:

res = Model.objects.filter(location__distance_lte=(SearchPoint, D(m=2000)))
                   .annotate(distance=Distance('location', SearchPoint))
                   .order_by('distance')

通过使用 annotate,您可以向查询返回的每个模型对象“添加”一个名为 distance 的字段。

也就是说,如果你这样做:

for item in res:
    print(item.distance)

您将获得每个模型对象到SearchPoint的距离。

<小时/>

如果您绝对想在模型中使用@property,则应该以接受SearchPoint 作为参数的方式定义它:

@property
def distance_to_searcher(self, search_point):
    distance=self.location.distance(search_point)
    return distance * 100

但是您还必须修改您的查询:

res = Model.objects.filter(location__distance_lte=(SearchPoint, D(m=2000)))
                   .order_by('distance')

因为您不再需要使用注释在查询集中创建距离字段。
现在,如果你这样做:

for item in res:
    print(item.distance_to_searcher(SearchPoint))

您将得到与上面相同的结果。

关于python - 按距离对结果进行排序,并获取它们与查询点之间的距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46106660/

相关文章:

python - 网页抓取,如何在 python 中使用 bs4 从两个相同标签中提取数据

python - 小行星程序使用间接绘制,glMultiDrawArraysIndirect不渲染并绘制空白

django - 在 django rest 框架中获取文件参数(大小、文件名)

javascript - JSpdf 在 Internet Explorer 中工作但在 Chrome 中不工作

python - 使用dokku部署Django应用时收集静态配置错误

django - 涉及具有几何图形但不查询几何图形本身的表的查询是否比不查询几何图形的表花费更长的时间?

python - 打印字符串中的偶数字符并忽略白色字符串

python - Django-Rest-Framework JWT 单元测试说 "No Authentication Provided"

python - 如何分配给 Django PointField 模型属性?

python - 为什么它抛出`GeoDjango Postgis 要求不满足在运行迁移时出现错误?