【问题标题】:Interfacing with Sqlalchemy query object to extend, custom query types与 Sqlalchemy 查询对象接口以扩展自定义查询类型
【发布时间】:2012-10-27 15:17:47
【问题描述】:

我正在为我的模型添加分页功能。我可以使用 mixin 中的方法来做到这一点,我想我了解在这种情况下分页是什么,但我正在寻找添加查询,以便我可以在任何我想要的地方传递分页,而无需硬编码模型方法并且没有 mixin,例如:

Mymodel.query.filter(Mymodel.attr=='X').paginate(**args, **kwargs)

flask-sqlalchemy 会这样做,但我没有使用它,尽管我已经尝试过它以尝试提取一些功能。

所以如果我有这样的方法:

def paginate(self, page, per_page=20):
        items = self.limit(per_page).offset((page - 1) * per_page).all()
        return Pagination(self, page, per_page, self.count(), items)

如何将它作为带有接口的东西插入到 sqlalchemy 查询链中?我有点做并且不遵循它在flask-sqlalchemy中是如何完成的,但我想提取/学习如何做到这一点并在未来更好地控制查询,改进我对sqlalchemy的使用,所以我不完全知道我要去哪里,只是问一个问题,然后从那里开始。

长答案:继续阅读 sqlalchemy 文档和代码,直到我获得更深入的理解。我正在寻找扩展 orm.Query - 我已经完成了,但我不知道如何将它与我的项目联系起来,因为我不了解 sqlalchemy 的底层机制,但我认为我只需要将我的分页查询添加到我正在使用的声明性基础 Base 中,但一旦我重新开始工作就会看到。

【问题讨论】:

    标签: python sql sqlalchemy


    【解决方案1】:

    你读过这本书吗?

    http://packages.python.org/Flask-SQLAlchemy/api.html?highlight=pagination#flask.ext.sqlalchemy.Pagination

    它清楚地解释了要在烧瓶中使用带有 sqlalchemy 扩展的分页,你可以这样做:

    class flask.ext.sqlalchemy.Pagination(query, page, per_page, total, items)¶
    

    在您的具体情况下,您可以这样做:

    myquery = Mymodel.query.filter(Mymodel.attr=='X')
    pagination = Pagination(myquery,page,per_page,total,items)
    

    然后在你的模板中,你可以使用这个分页对象通过 render_pagination() 宏进行渲染

    【讨论】:

    • 这个我理解并且没有问题,所以也许我应该澄清一下。我希望能够操纵 Query 对象以使在链中的几乎任何点都可以使用“分页”。 Basequery.paginate 返回这个,我已经有了 Paginate 类的想法。换句话说,我想避免对每个模型的小 p 分页查询进行硬编码,而是构建一种扩展 orm.Query like 的方法,我看到了flask-sqla。我希望自己做 Basequery.paginate 作为我正在做的一部分,而不需要通过 Flask-Sqlalchemy 的箍。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-20
    相关资源
    最近更新 更多