【问题标题】:Flask-SqlAlchemy Filtering by time section of datetimeFlask-SqlAlchemy 按日期时间的时间段过滤
【发布时间】:2017-08-04 02:58:56
【问题描述】:

我希望使用 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])

它按预期打印出输入的时间。但是查询不工作。

管理面板_1 |响应 = self.full_dispatch_request()

管理面板_1 |文件“/usr/local/lib/python3.5/dist-packages/flask/app.py”,第 1641 行,在 full_dispatch_request 中

管理面板_1 | rv = self.handle_user_exception(e)

管理面板_1 |文件“/usr/local/lib/python3.5/dist-packages/flask/app.py”,第 1544 行,在 handle_user_exception 中

管理面板_1 | reraise(exc_type, exc_value, tb)

管理面板_1 |文件“/usr/local/lib/python3.5/dist-packages/flask/_compat.py”,第 33 行,重新提出

管理面板_1 |提升价值

管理面板_1 |文件“/usr/local/lib/python3.5/dist-packages/flask/app.py”,第 1639 行,在 full_dispatch_request 中

管理面板_1 | rv = self.dispatch_request()

管理面板_1 |文件“/usr/local/lib/python3.5/dist-packages/flask/app.py”,第 1625 行,在 dispatch_request 中

管理面板_1 |返回 self.view_functionsrule.endpoint

管理面板_1 |文件“/usr/local/lib/python3.5/dist-packages/flask_admin/base.py”,第 69 行,在内部

管理面板_1 | return self._run_view(f, *args, **kwargs)

管理面板_1 | _run_view 中的文件“/usr/local/lib/python3.5/dist-packages/flask_admin/base.py”,第 368 行

管理面板_1 |返回 fn(self, *args, **kwargs)

管理面板_1 |文件“/usr/local/lib/python3.5/dist-packages/flask_admin/model/base.py”,第 1818 行,在 index_view 中

管理面板_1 | view_args.search, view_args.filters)

管理面板_1 |文件“/usr/local/lib/python3.5/dist-packages/flask_admin/contrib/sqla/view.py”,第 975 行,在 get_list 中

管理面板_1 | count = count_query.scalar() if count_query else None

管理面板_1 | AttributeError:“列表”对象没有属性“标量”

另外,我从 sqlalchemy 导入 Time 和 Cast,这样可以吗,还是应该从 flask-sqlalchemy 获取?

from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import Time, cast

【问题讨论】:

    标签: flask-sqlalchemy flask-admin


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-10
      • 2015-03-06
      • 2013-10-20
      • 2015-12-17
      • 1970-01-01
      • 2018-01-25
      相关资源
      最近更新 更多