Я пишу RESTful API, используя Flask и Flask-SQLalchemy, а также Flask-Login. У меня есть модель 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
не ссылаются на число с плавающей запятой или даже число, а вместо этого на атрибут таблицы. Мой вопрос заключается в том, как на самом деле использовать то, что lat и lon равны (в базе данных они равны 37,7 и -122,4 соответственно).