2017-03-13 3 views
1

Flask-SQlAlchemyを使用して、Flask-Adminのdatetimeカラムの時間セクションでフィルタリングしたいと考えています。これまでFlask-SqlAlchemy日時の時間セクションによるフィルタリング

私の試みは、次のとおりです。

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 | File "/usr/local/lib/python3.5/dist-packages/flask/app.py", line 1641, in full_dispatch_request

admin-panel_1 | rv = self.handle_user_exception(e)

admin-panel_1 | File "/usr/local/lib/python3.5/dist-packages/flask/app.py", line 1544, in handle_user_exception

admin-panel_1 | reraise(exc_type, exc_value, tb)

admin-panel_1 | File "/usr/local/lib/python3.5/dist-packages/flask/_compat.py", line 33, in reraise

admin-panel_1 | raise value

admin-panel_1 | File "/usr/local/lib/python3.5/dist-packages/flask/app.py", line 1639, in full_dispatch_request

admin-panel_1 | rv = self.dispatch_request()

admin-panel_1 | File "/usr/local/lib/python3.5/dist-packages/flask/app.py", line 1625, in dispatch_request

admin-panel_1 | return self.view_functionsrule.endpoint

admin-panel_1 | File "/usr/local/lib/python3.5/dist-packages/flask_admin/base.py", line 69, in inner

admin-panel_1 | return self._run_view(f, *args, **kwargs)

admin-panel_1 | File "/usr/local/lib/python3.5/dist-packages/flask_admin/base.py", line 368, in _run_view

admin-panel_1 | return fn(self, *args, **kwargs)

admin-panel_1 | File "/usr/local/lib/python3.5/dist-packages/flask_admin/model/base.py", line 1818, in index_view

admin-panel_1 | view_args.search, view_args.filters)

admin-panel_1 | File "/usr/local/lib/python3.5/dist-packages/flask_admin/contrib/sqla/view.py", line 975, in get_list

admin-panel_1 | count = count_query.scalar() if count_query else None

admin-panel_1 | AttributeError: 'list' object has no attribute 'scalar'

はまた、私はこれはOKで、SQLAlchemyのから時間とキャストをインポートしたり、私がフラスコSQLAlchemyのからそれを取得する必要がありますか?

from flask_sqlalchemy import SQLAlchemy 
from sqlalchemy import Time, cast 

答えて

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 
関連する問題