按距离对结果进行排序,得到它们与查询点的距离
Sort results by distance and get the distance between them and the query point
我目前使用以下方法按模型的距离对结果进行排序:
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')
这让我可以按 distance
.
对 2000 米以内的结果进行排序
现在我还想显示 SearchPoint
给出的搜索器与我的 Model
.
的结果之间的距离
Models.py
在我的模型 class 中,我定义了以下内容 属性:
@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()
class.
理想情况下,我会将距离四舍五入到一个合适的数字。
编辑:我在 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)
我发现解决方案是在我的模板中简单地调用 .distance
。 res
变量已经有距离作为属性,不需要额外的 属性.
由于您正在创建此查询:
res = Model.objects.filter(location__distance_lte=(SearchPoint, D(m=2000)))
.annotate(distance=Distance('location', SearchPoint))
.order_by('distance')
使用 annotate
,你是 "adding" 一个名为 distance
的字段到每个查询 returns.
的模型对象
也就是说,如果您这样做:
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')
因为您不再需要使用注释在查询集中创建 distance
字段。
现在,如果你这样做:
for item in res:
print(item.distance_to_searcher(SearchPoint))
你会得到与上面相同的结果。
我目前使用以下方法按模型的距离对结果进行排序:
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')
这让我可以按 distance
.
现在我还想显示 SearchPoint
给出的搜索器与我的 Model
.
Models.py 在我的模型 class 中,我定义了以下内容 属性:
@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()
class.
理想情况下,我会将距离四舍五入到一个合适的数字。
编辑:我在 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)
我发现解决方案是在我的模板中简单地调用 .distance
。 res
变量已经有距离作为属性,不需要额外的 属性.
由于您正在创建此查询:
res = Model.objects.filter(location__distance_lte=(SearchPoint, D(m=2000)))
.annotate(distance=Distance('location', SearchPoint))
.order_by('distance')
使用 annotate
,你是 "adding" 一个名为 distance
的字段到每个查询 returns.
也就是说,如果您这样做:
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')
因为您不再需要使用注释在查询集中创建 distance
字段。
现在,如果你这样做:
for item in res:
print(item.distance_to_searcher(SearchPoint))
你会得到与上面相同的结果。