2017-03-13 1 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 
관련 문제