以下是我正在尝试做的简化用例:
class Location(db.Model):
__tablename__ = 'locations'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.UnicodeText, nullable=False)
# a postgres EARTH type
earth_location = db.deferred(db.Column(EARTH))
@hybrid_method
def location_distance_from_current_location(self, current_latitude, current_longitude):
return db.func.earth_distance(
db.func.ll_to_earth(
current_latitude, current_longitude), self.earth_location)
我知道如何为此编写SQL,但我如何在SQLAlchemy中对此进行建模?
SELECT
locations.id, locations.name,
earth_distance(ll_to_earth(40.766810, -73.978227), locations.earth_location) AS location_distance_from_current_location
FROM
locations
WHERE (earth_box(ll_to_earth(40.766810, -73.978227, 10000) @> locations.earth_location)
ORDER BY location_distance_from_current_location ASC
如何将传递给混合方法的current_latitude
和current_longitude
值?我不需要将混合方法用作filter
,因为earth_box()
函数会照顾我。
谢谢!
答案 0 :(得分:0)
混合方法是一种同时具有Python实现和SQL实现的方法。您已经提供了SQL实现,但没有提供Python实现。您最好的办法是提供Python实现。
如果您不需要在每个实例上访问location_distance_from_current_location
,则可以在查询时获取值:
session.query(Location, Location.location_distance_from_current_location(...)).filter(...)
这会为您提供(Location, distance)
元组的列表。