Django计算场和MVT usag

2024-09-30 12:25:05 发布

您现在位置:Python中文网/ 问答频道 /正文

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

  1. 发送zipcode,并通过POST查看
  2. 从ZIP值获取Lat Long坐标
  3. 按专业筛选组织(包含在职位申请中)
  4. 对于组织queryset中返回的每个对象,计算距离POST zipcode、模型组织Lat、Long坐标并返回模板

型号:

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。所以简而言之,下面的答案是好的并且有效的-但是,我没有那么清楚我的问题。你知道吗


Tags: 模型selftruedataaddressrequestdefzip
1条回答
网友
1楼 · 发布于 2024-09-30 12:25:05

你剩下的代码呢??你知道吗

您可以在每个组织中循环,计算距离并将其保存到组织实例上的属性中。你知道吗

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正在给google打电话,这是个坏消息,网络操作非常慢(看起来您已经在视图中对zip进行地理编码了)。如果您的查询集中有很多组织,这对最终用户来说是不好的。你可以“缓存”拉链保存在你的数据库与lat/lng。因此,您可以先在数据库中查看是否有结果,如果没有结果,请致电谷歌(因为lat/lng不应更改为zip)

  • django有一个名为geodjango的扩展,它为空间数据库提供了一个api,mysql和postgres都有扩展,提供了基于距离的可索引、性能良好的过滤方法,此外geodjango api还提供了一个distance方法来完成您正在尝试的操作。Def值得一试,看看它是否有助于满足您的需求

相关问题 更多 >

    热门问题