Django计算了字段和MVT用法

时间:2014-03-03 00:20:14

标签: python django django-models geolocation django-views

所以,我有一个有趣的问题,我很难接近。我在向模板发送响应并添加一些实例/计算变量之前尝试拦截查询集。我通常会将此作为属性添加到模型中,但进行计算的变量之一来自用户通过POST请求输入。具体来说,这就是我想要做的事情(#4是我在概念上遇到问题的地方,其他一切工作正常,包括邮政编码计算):

  1. 通过POST发送邮政编码和专业信息以查看
  2. 从ZIP值
  3. 获取Lat Long坐标
  4. 按专业过滤组织(包含在POST请求中)
  5. 对于返回的组织queryset中的每个对象,计算POST邮政编码的距离,以及模型组织Lat,Long坐标并返回模板
  6. 型号:

    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请求提供的参数的属性或mangager。我想为对象返回一个数据集,而不是查询集和单独的dict。简而言之,下面的答案是好的并且有效 - 但是,我在问题上并不清楚。

1 个答案:

答案 0 :(得分:0)

你的代码的其余部分在哪里?

您可以遍历每个组织并计算距离并将其保存到组织实例上的属性中。

def searchdoc(request):
  if 'zip' in request.POST:
    dft_zip = request.POST['zip']
    zip_coord = geocode(dft_zip)
    organizations = Organization.objects.filter(some_filter_here=here)
    for org in organizations:
      org.distance = distance(dft_zip, org.lat, org.lng)

有些事情需要注意:

  • 如果geocode_dec正在拨打谷歌电话,这是个坏消息,网络操作非常慢(看来你已经在视图中对zip进行了地理编码)。如果您的查询集中有很多组织,这对最终用户来说是不利的。您可以通过使用lat / lng将它们保存在数据库中来“缓存”拉链。所以你最初可以查看你的数据库,看看你是否有结果然后调用谷歌,如果你没有,(因为lat / lng永远不会改变为拉链)

  • django有一个名为geodjango的扩展,为空间数据库提供api,mysql和postgres都有扩展,提供基于距离过滤的可索引,性能方法,另外geodjango api提供distance做你想要做的事情的方法。值得一试,看看它是否有助于满足您的要求