【问题标题】:Using the JSON response from 3rd party api with geodjango将来自 3rd 方 api 的 JSON 响应与 geodjango 一起使用
【发布时间】: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)))

我需要解决的问题,希望您能帮忙解决一下我该怎么做

  1. 过滤 api 响应,只从它们那里得到我需要的东西(组件国家、几何纬度、几何 lng)

  2. 收集 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 的角度来处理这个问题,并完全排除了客户端

标签: json django api geodjango


【解决方案1】:

我认为你可以这样尝试(基于 OpenCage 提供的演示 JSON 响应):

import requests
from django.db.models import Q

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()
    filter_query = Q()
    radius = 10
    for item in locations.get('results', []):
         geo = item.get('geometry')
         lat = geo.get('lat')
         lng = geo.get('lng')
         point = Point(lng, lat)    
         filter_query |= Q(location__distance_lt=(point, Distance(km=radius)))
    return Place.objects.filter(filter_query)

【讨论】:

    猜你喜欢
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    • 1970-01-01
    • 2016-08-06
    • 2021-11-13
    相关资源
    最近更新 更多