所以,我有一个有趣的问题,我很难接近。我试图在向模板发送响应之前截获queryset,并添加一些实例/计算变量。我通常会将其作为属性添加到模型中,但是进行计算的变量之一来自用户通过POST请求进行的输入。具体来说,这就是我要做的(4是我在概念上遇到的问题,其他一切都正常,包括邮政编码计算):
型号:
class Organization(models.Model):
....
lat = models.CharField(max_length=30, null=True, blank=True)
long = models.CharField(max_length=30, null=True, blank=True)
def __unicode__(self):
return "%s - %s - %s - %s - %s - %s - %s " % (self.name, self.street, self.streetaddtl, self. city, self.state, self.zip, self.external_website)
def save(self):
if not self.lat or not self.long:
addr = self.street + ' ' + self.city + ' ' + self.state + ' ' + self.zip
self.lat, self.long = self.geocode(addr)
super(Organization, self).save()
def geocode(self, address):
address = urllib.quote_plus(address)
request = "http://maps.googleapis.com/maps/api/geocode/json?address=%s&sensor=false" % address
data = json.loads(urllib.urlopen(request).read())
if data['status'] == 'OK':
lat = data['results'][0]['geometry']['location']['lat']
lng = data['results'][0]['geometry']['location']['lng']
return Decimal(lat), Decimal(lng)`
查看:
from search.lib.utils import geocode
....
def searchdoc(request):
if 'zip' in request.POST:
dft_zip = request.POST['zip']
zip_coord = geocode(dft_zip)
助手函数
def distance(zip, b_lat, b_lng):
b_lat = Decimal(b_lat)
b_lng = Decimal(b_lng)
zipLat, zipLng = geocode_dec(zip)
zipLat = radians(zipLat)
b_lat = radians(b_lat)
long_diff = radians(zipLng - b_lng)
dist = (sin(zipLat) * sin(b_lat) +
cos(zipLat) * cos(b_lat) * cos(long_diff))
return degrees(acos(dist))*69.09
编辑 使用下面的解决方案确实允许我快速迭代和计算距离,但是我的目标是根据计算的距离对数据进行排序。这个问题实际上是因为我不能在模型上创建一个属性或管理器来接受post请求提供的参数。我希望为对象返回一个数据集,而不是查询集和一个单独的dict。所以简而言之,下面的答案是好的并且有效的-但是,我没有那么清楚我的问题。你知道吗
你剩下的代码呢??你知道吗
您可以在每个组织中循环,计算距离并将其保存到组织实例上的属性中。你知道吗
需要注意的事项:
如果
geocode_dec
正在给google打电话,这是个坏消息,网络操作非常慢(看起来您已经在视图中对zip进行地理编码了)。如果您的查询集中有很多组织,这对最终用户来说是不好的。你可以“缓存”拉链保存在你的数据库与lat/lng。因此,您可以先在数据库中查看是否有结果,如果没有结果,请致电谷歌(因为lat/lng不应更改为zip)django有一个名为geodjango的扩展,它为空间数据库提供了一个api,mysql和postgres都有扩展,提供了基于距离的可索引、性能良好的过滤方法,此外geodjango api还提供了一个distance方法来完成您正在尝试的操作。Def值得一试,看看它是否有助于满足您的需求
相关问题 更多 >
编程相关推荐