首页 文章

Flask-SqlAlchemy按日期时间的时间段过滤

提问于
浏览
1

我希望使用Flask-SQlAlchemy在Flask-Admin中按日期时间列的时间部分进行过滤 .

我到目前为止的尝试是:

class BaseTimeBetweenFilter(filters.TimeBetweenFilter):
    def apply(self, query, value, alias=None):
        return query.filter(cast(Doctor.datetime, Time) >= value[0],
              cast(Doctor.datetime, Time) <= value[1]).all()

我有时间选择器显示,如果我这样做

print (value[0])

要么

print (value[1])

它按预期打印出输入的时间 . 但是查询无效 .

admin-panel_1 | response = self.full_dispatch_request()admin-panel_1 |文件“/usr/local/lib/python3.5/dist-packages/flask/app.py”,第1641行,在full_dispatch_request中admin-panel_1 | rv = self.handle_user_exception(e)admin-panel_1 |文件“/usr/local/lib/python3.5/dist-packages/flask/app.py”,第1544行,在handle_user_exception中admin-panel_1 | reraise(exc_type,exc_value,tb)admin-panel_1 |文件“/usr/local/lib/python3.5/dist-packages/flask/_compat.py”,第33行,重新加入admin-panel_1 |提升值admin-panel_1 |文件“/usr/local/lib/python3.5/dist-packages/flask/app.py”,第1639行,在full_dispatch_request中admin-panel_1 | rv = self.dispatch_request()admin-panel_1 |在dispatch_request admin-panel_1中输入文件“/usr/local/lib/python3.5/dist-packages/flask/app.py”,第1625行 . return self.view_functionsrule.endpoint admin-panel_1 |文件“/usr/local/lib/python3.5/dist-packages/flask_admin/base.py”,第69行,位于内部admin-panel_1 | return self._run_view(f,* args,** kwargs)admin-panel_1 | _run_view admin-panel_1中的文件“/usr/local/lib/python3.5/dist-packages/flask_admin/base.py”,第368行return fn(self,* args,** kwargs)admin-panel_1 |在index_view admin-panel_1中输入文件“/usr/local/lib/python3.5/dist-packages/flask_admin/model/base.py”,第1818行 . view_args.search,view_args.filters)admin-panel_1 |在get_list admin-panel_1中输入文件“/usr/local/lib/python3.5/dist-packages/flask_admin/contrib/sqla/view.py”,第975行 . count = count_query.scalar()if count_query else否admin-panel_1 | AttributeError:'list'对象没有属性'scalar'

另外,我从sqlalchemy导入时间和演员,这是好还是我应该从flask-sqlalchemy获取它?

from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import Time, cast

1 回答

  • 1

    Flask-Admin通过连接表,应用过滤器和排序来构造查询 . 完成所有这些过程之后,它会调用查询本身并获取其结果 .

    您的 apply 方法应该返回 sqlalchemy.orm.query.Query 实例作为 query 参数获取的实例 . 当您添加 .all() 方法时,将调用此查询,并将查询结果作为列表获取 . 从结果值中删除 .all() 调用,您的过滤器应该有效:

    class BaseTimeBetweenFilter(filters.TimeBetweenFilter):
        def apply(self, query, value, alias=None):
            return query.filter(
                cast(Doctor.datetime, Time) >= value[0],
                cast(Doctor.datetime, Time) <= value[1]
            )
    

    进口来源并不重要 . flask_sqlalchemy.SQLAlchemy 实例包含与 sqlalchemy 相同的对象:

    >>> from flask_sqlalchemy import SQLAlchemy
    >>> db = SQLAlchemy()
    >>> db.Time
    <class 'sqlalchemy.sql.sqltypes.Time'>
    >>> db.cast
    <function cast at 0x7f60a3e89c80>
    >>> from sqlalchemy import Time, cast
    >>> Time
    <class 'sqlalchemy.sql.sqltypes.Time'>
    >>> cast
    <function cast at 0x7f60a3e89c80>
    >>> db.cast == cast and db.Time == Time
    True
    

相关问题