代码之家  ›  专栏  ›  技术社区  ›  Roma

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

  •  1
  • Roma  · 技术社区  · 8 年前

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

    意见。py公司

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

    distance

    现在我还要显示搜索者之间的距离,由 SearchPoint 以及我的 Model .

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

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

    但我得到了以下错误:

    views.py Point()

    编辑:我定义 在里面 意见。py公司

    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)
    
    2 回复  |  直到 8 年前
        1
  •  1
  •   John Moutafis Milani Igor    8 年前

    由于您正在创建此查询:

    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 搜索点 作为论点:

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

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

        2
  •  1
  •   Roma    8 年前

    我发现解决方法就是打电话 .distance res