【发布时间】:2019-10-09 14:31:18
【问题描述】:
我正在尝试创建一种方法来按位置和半径缩小 django 应用程序上的帖子。我尝试这样做的方式是:
- 使用第 3 方 (OpenCage) API 将位置转换为 lat / lng
- 收集 JSON 响应,筛选出最正确的响应(美国的第一个响应)
- 使用响应 lat & lng 通过 GIS 过滤列表
我所做的是成功连接到 API,并返回 lat & lng,但是我必须在我的模板中而不是在我的模型中过滤响应。我还发现以下似乎是缩小半径结果所需的解决方案:
from django.contrib.gis.geos import Point
from django.contrib.gis.measure import Distance
lat = 52.5
lng = 1.0
radius = 10
point = Point(lng, lat)
Place.objects.filter(location__distance_lt=(point, Distance(km=radius)))
我需要解决的问题,希望您能帮忙解决一下我该怎么做
过滤 api 响应,只从它们那里得到我需要的东西(组件国家、几何纬度、几何 lng)
收集 lat & lng 以用于上述代码?
views.py
from posts import services
def search(request):
queryset_list = posts.objects.order_by('id')
if 'location' in request.GET:
q = request.GET['location']
locations_list = services.get_location(q)
context = {
'posts': queryset_list,
'locations_list': locations_list
}
return render(request, 'posts/search.html', context)
services.py
import requests
def get_location(location):
url = 'https://api.opencagedata.com/geocode/v1/json'
params = {'q': location, 'key': '###', 'language': 'en', 'pretty': 1}
r = requests.get(url, params=params)
locations = r.json()
return locations
【问题讨论】:
-
你真的需要在后端使用那个 api 吗?我认为这应该放在前端,所以资源不会拉你的服务器而是客户端。当您需要保存某些内容时,将其传递给后端。
-
@Jota 我认为你是对的,但是我确实需要使用 API 的结果过滤存储的帖子,我对一个完全不同的方向持开放态度,我可以更有效地达到预期的结果
-
例如,如果您有图形界面,则必须在 AJAX 的前端中进行搜索和 get_location。当 API 响应时,过滤 JSON 的属性,然后将其传递给后端。
-
@Jota 所以我可以将 lat 和 lng 属性从 JSON 异步传递到上面的 radius 脚本并跳过混乱并为用户节省重新加载?我一直从 django 的角度来处理这个问题,并完全排除了客户端