2017-01-25 32 views
0

我需要一个数学表达式为了我的查询半径过滤器:Python的烧瓶SQLAlchemy的ORDER_BY数学表达式 - 不能识别表值浮动

这正是我需要的,但列zimmer_latzimmer_lng不在这里被认为是来自Zimmer对象的列,但是作为导致float expected error的字符串。制作一个类型转换为浮动 - float('zimmer_lat')导致cannot cast string to float error

all_rooms_in_city = Zimmer.query.join(User).filter_by(bezahlt=True).order_by(asc(acos(sin(loc_latitude) * sin('zimmer_lat') + cos(loc_latitude) * cos('zimmer_lat') * cos('zimmer_lng' - (loc_longitude))) * 6371)) 

这里是作品和zimmer_lat是公认的浮动:

all_rooms_in_city = Zimmer.query.join(User).filter_by(bezahlt=True).order_by(asc('zimmer_lat')) 
+0

好,''zimmer_lat''是一个字符串,那么你当然不能把它传递给'math.cos'。您需要在数据库引擎中查找余弦的等价函数,并使用例如'func.cos(Zimmer.zimmer_lat)'。 – univerio

回答

0

即使我不得不删除与用户的加入,我发现了有效的解决方案,甚至让我对结果进行排序半径。感谢@univerio与func()的提示。我不得不使用filter()而不是filter_by()

如果有人知道如何保持加入用户,请让我知道。

解决方案:

all_rooms_in_city = Zimmer.query.filter(func.acos(func.sin(loc_latitude) * func.sin(Zimmer.zimmer_lat) + func.cos(loc_latitude) * func.cos(Zimmer.zimmer_lat) * func.cos(Zimmer.zimmer_lng - (loc_longitude))) * 6371 <= 2000).order_by(asc(func.acos(func.sin(loc_latitude) * func.sin(Zimmer.zimmer_lat) + func.cos(loc_latitude) * func.cos(Zimmer.zimmer_lat) * func.cos(Zimmer.zimmer_lng - (loc_longitude))) * 6371))