【发布时间】:2019-04-03 07:12:59
【问题描述】:
我正在使用 Flask 和 Flask-SQLalchemy 以及 Flask-Login 编写一个 RESTful api。我有一个模型Users,它的初始化如下:
class Users(UserMixin, db.Model):
__tablename__ = "users"
# STATIC Standard required info
id = db.Column("id", db.Integer, primary_key = True)
public_id = db.Column("public_id", db.String(50), unique = True)
email = db.Column("email", db.String(50), unique = True)
username = db.Column("username", db.String(20), unique = True)
password = db.Column("password", db.String(20))
# DYNAMIC Standard required info
lat = db.Column("lat", db.Float)
lon = db.Column("lon", db.Float)
表格中还有其他元素,但纬度和经度最相关。我有一个方法distanceMath(),它接受当前登录用户的纬度和经度,以及表格中的纬度和经度来计算它们之间的距离。但我无法弄清楚如何在以下调用distanceMath 的查询期间访问表值而不会收到语法错误:
lat1 = current_user.lat
lon1 = current_user.lon
users = Users.query.filter(distanceMath(lat1, Users.lat, lon1, Users.lon)==1)
output = []
for user in users:
data = {}
data["username"] = user.username
output.append(data)
return str(output)
以防万一,这里是distanceMath 方法:
# Haversine Distance
def distanceMath(lat1, lat2, lon1, lon2):
distance = math.acos(math.sin(math.radians(lat1))*math.sin(math.radians(lat2))) + math.cos(math.radians(lat1))*math.cos(math.radians(lat2))*math.cos(math.radians(lon1)-math.radians(lon2))
return distance
错误的一个例子是:
TypeError: must be real number, not InstrumentedAttribute
在我看来,这本质上是说User.lat 和User.lon 不是指浮点数甚至是数字,而是表的属性。我的问题是如何实际使用纬度和经度等于(在数据库中它们分别等于 37.7 和 -122.4)。
【问题讨论】:
-
“没有收到语法错误”:请在帖子中包含错误。我冒昧地编辑了您的帖子,但保留了例如视图(?)代码中的缩进错误。
-
另外,你也许可以从这个答案中得到一些想法:stackoverflow.com/a/51018368/2681632。诀窍是形成一个在数据库中求值的 SQL 表达式。
-
添加了一个语法错误的例子。 ****EDIT**** 目前也在尝试来自该链接的想法,将更新。
-
确切地说,这不是语法错误:)。编辑时也不需要包含“***** EDIT *****”。 SO 不是一个论坛,如果您可以从整体上改进您的问题(并使其对未来的读者有用),那就更好了。
标签: python sqlite sqlalchemy flask-sqlalchemy