Django annotate无法访问模型的浮点数

时间:2015-08-17 20:31:43

标签: python django string floating-point

我正在尝试使用对象与用户提供的位置的距离来注释查询集。以下是我到目前为止的情况:

lat1 = request.POST['lat']
lon1 = request.POST['lon']

locations = Location.objects.annotate(distance_away = posDifference('lat', 'lon', lat1, lon1)).order_by('distance_away')[0]

这是posDifference函数,它以英里为单位返回两点之间的距离。

def posDifference(lat1, lon1, lat2, lon2):

    EARTH_RADIUS_IN_MILES = 3958.761

    lat1 = float(lat1)
    lon1 = float(lon1)
    lat2 = float(lat2)
    lon2 = float(lon2)

    lat1 = radians(lat1)
    lat2 = radians(lat2)

    delta_lon = radians(lon1 - lon2)
    cos_x = (sin(lat1) * sin(lat2) + cos(lat1) * cos(lat2) * cos(delta_lon)) # Distance formula
    distance = acos(cos_x) * EARTH_RADIUS_IN_MILES # Conversion to miles

    return distance

我得到的错误是ValueError: could not convert string to float: lat lat1 = float(lat1)posDifference。我相信字符串'lat''lon'正在传递给函数而不是位置对象的字段latlon

2 个答案:

答案 0 :(得分:0)

当然,它们只是传递给了功能。您只需使用该参数调用posDifference即可。我不确定你为什么期待其他结果...

您应该以不同的方式构建函数,使用F引用正确的db列,使用Func引用一些SQL函数(sincos,{ {1}})。它看起来像这样:

acos

这应该可以正常工作。更多相关信息,您可以向django documentation

学习

答案 1 :(得分:0)

您最好使用GeoDjango进行测量。有现成的使用函数来计算距离,比较距离,检查地图上的点是否在某个范围或矩形等内。所有这些都是在数据库级别完成的,只需要一些数据库扩展。