如何使用带有查询参数的混合方法编写模型

时间:2016-05-27 06:36:55

标签: sqlalchemy

以下是我正在尝试做的简化用例:

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_latitudecurrent_longitude值?我不需要将混合方法用作filter,因为earth_box()函数会照顾我。

谢谢!

1 个答案:

答案 0 :(得分:0)

混合方法是一种同时具有Python实现和SQL实现的方法。您已经提供了SQL实现,但没有提供Python实现。您最好的办法是提供Python实现。

如果您不需要在每个实例上访问location_distance_from_current_location,则可以在查询时获取值:

session.query(Location, Location.location_distance_from_current_location(...)).filter(...)

这会为您提供(Location, distance)元组的列表。