Python Flask管理员:混合属性可以搜索吗?
在使用Flask Admin创建的列表视图中,我添加了两列sqlalchemy对象,它们实际上是在我的对象类中使用混合属性计算的Python Flask管理员:混合属性可以搜索吗?,python,flask-sqlalchemy,flask-admin,Python,Flask Sqlalchemy,Flask Admin,在使用Flask Admin创建的列表视图中,我添加了两列sqlalchemy对象,它们实际上是在我的对象类中使用混合属性计算的 class MyClass(db.Model): @hybrid_property def state(self): now = datetime.datetime.now() state = 'OK' for panne in self.pannes: if panne.f_
class MyClass(db.Model):
@hybrid_property
def state(self):
now = datetime.datetime.now()
state = 'OK'
for panne in self.pannes:
if panne.f_indispo < now:
continue
if panne.d_indispo <= now and panne.f_indispo >= now:
state = 'KO'
break
if panne.d_indispo > now:
state = 'PR'
return state
@hybrid_property
def station_name(self):
if app.config['STATIONS'] is not None and self.id_station in app.config['STATIONS']:
return app.config['STATIONS'][self.id_station]
return unicode(self.id_station)
除了我的两个“混合列”既不能搜索也不能排序之外,一切都正常。
如果我将它们添加到列可搜索列表中,我会得到:
“国家”财产:
File "/usr/lib/python2.6/site-packages/Flask_Admin-1.0.8-py2.6.egg/flask_admin/contrib/sqla/view.py", line 271, in __init__
super(ModelView, self).__init__(model, name, category, endpoint, url)
File "/usr/lib/python2.6/site-packages/Flask_Admin-1.0.8-py2.6.egg/flask_admin/model/base.py", line 515, in __init__
self._refresh_cache()
File "/usr/lib/python2.6/site-packages/Flask_Admin-1.0.8-py2.6.egg/flask_admin/model/base.py", line 540, in _refresh_cache
self._search_supported = self.init_search()
File "/usr/lib/python2.6/site-packages/Flask_Admin-1.0.8-py2.6.egg/flask_admin/contrib/sqla/view.py", line 410, in init_search
for column in self._get_columns_for_field(p):
File "/usr/lib/python2.6/site-packages/Flask_Admin-1.0.8-py2.6.egg/flask_admin/contrib/sqla/view.py", line 379, in _get_columns_for_field
attr = getattr(self.model, field, None)
File "/usr/lib/python2.6/site-packages/SQLAlchemy-0.9.6-py2.6-linux-x86_64.egg/sqlalchemy/ext/hybrid.py", line 738, in __get__
return self.expr(owner)
File "/var/www/***/app/***.py", line 90, in state
for panne in self.pannes:
File "/usr/lib/python2.6/site-packages/SQLAlchemy-0.9.6-py2.6-linux-x86_64.egg/sqlalchemy/sql/operators.py", line 338, in __getitem__
return self.operate(getitem, index)
File "/usr/lib/python2.6/site-packages/SQLAlchemy-0.9.6-py2.6-linux-x86_64.egg/sqlalchemy/orm/attributes.py", line 171, in operate
return op(self.comparator, *other, **kwargs)
File "/usr/lib/python2.6/site-packages/SQLAlchemy-0.9.6-py2.6-linux-x86_64.egg/sqlalchemy/sql/operators.py", line 338, in __getitem__
return self.operate(getitem, index)
File "/usr/lib/python2.6/site-packages/SQLAlchemy-0.9.6-py2.6-linux-x86_64.egg/sqlalchemy/sql/operators.py", line 183, in operate
raise NotImplementedError(str(op))
NotImplementedError:
文件“/usr/lib/python2.6/site packages/Flask_Admin-1.0.8-py2.6.egg/Flask_Admin/contrib/sqla/view.py”,第271行,在__
super(ModelView,self)。\uuuuu init\uuuuuu(模型、名称、类别、端点、url)
文件“/usr/lib/python2.6/site packages/Flask_Admin-1.0.8-py2.6.egg/Flask_Admin/model/base.py”,第515行,在__
self.\u刷新\u缓存()
文件“/usr/lib/python2.6/site packages/Flask_Admin-1.0.8-py2.6.egg/Flask_Admin/model/base.py”,第540行,在刷新缓存中
self.\u search\u supported=self.init\u search()
文件“/usr/lib/python2.6/site packages/Flask_Admin-1.0.8-py2.6.egg/Flask_Admin/contrib/sqla/view.py”,第410行,在初始搜索中
对于self中的列。\u获取\u列\u用于\u字段(p):
文件“/usr/lib/python2.6/site packages/Flask\u Admin-1.0.8-py2.6.egg/Flask\u Admin/contrib/sqla/view.py”,第379行,在\u字段的\u get\u列中
attr=getattr(self.model,字段,无)
文件“/usr/lib/python2.6/site packages/SQLAlchemy-0.9.6-py2.6-linux-x86_64.egg/SQLAlchemy/ext/hybrid.py”,第738行,在__
返回self.expr(所有者)
文件“/var/www/***/app/***.py”,第90行,处于状态
对于self.pannes中的panne:
文件“/usr/lib/python2.6/site packages/SQLAlchemy-0.9.6-py2.6-linux-x86_64.egg/SQLAlchemy/sql/operators.py”,第338行,在u getitem中__
返回self.operate(getitem,index)
文件“/usr/lib/python2.6/site packages/SQLAlchemy-0.9.6-py2.6-linux-x86_64.egg/SQLAlchemy/orm/attributes.py”,第171行,在operate中
返回op(自比较器,*其他,**kwargs)
文件“/usr/lib/python2.6/site packages/SQLAlchemy-0.9.6-py2.6-linux-x86_64.egg/SQLAlchemy/sql/operators.py”,第338行,在u getitem中__
返回self.operate(getitem,index)
文件“/usr/lib/python2.6/site packages/SQLAlchemy-0.9.6-py2.6-linux-x86_64.egg/SQLAlchemy/sql/operators.py”,第183行,在operate中
引发未实施错误(str(op))
未实现错误:
“站点名称”属性:
File "/usr/lib/python2.6/site-packages/Flask_Admin-1.0.8-py2.6.egg/flask_admin/contrib/sqla/view.py", line 271, in __init__
super(ModelView, self).__init__(model, name, category, endpoint, url)
File "/usr/lib/python2.6/site-packages/Flask_Admin-1.0.8-py2.6.egg/flask_admin/model/base.py", line 515, in __init__
self._refresh_cache()
File "/usr/lib/python2.6/site-packages/Flask_Admin-1.0.8-py2.6.egg/flask_admin/model/base.py", line 540, in _refresh_cache
self._search_supported = self.init_search()
File "/usr/lib/python2.6/site-packages/Flask_Admin-1.0.8-py2.6.egg/flask_admin/contrib/sqla/view.py", line 410, in init_search
for column in self._get_columns_for_field(p):
File "/usr/lib/python2.6/site-packages/Flask_Admin-1.0.8-py2.6.egg/flask_admin/contrib/sqla/view.py", line 390, in _get_columns_for_field
raise Exception('Invalid field %s: does not contains any columns.' % field)
Exception: Invalid field station_name: does not contains any columns.
文件“/usr/lib/python2.6/site packages/Flask_Admin-1.0.8-py2.6.egg/Flask_Admin/contrib/sqla/view.py”,第271行,在__
super(ModelView,self)。\uuuuu init\uuuuuu(模型、名称、类别、端点、url)
文件“/usr/lib/python2.6/site packages/Flask_Admin-1.0.8-py2.6.egg/Flask_Admin/model/base.py”,第515行,在__
self.\u刷新\u缓存()
文件“/usr/lib/python2.6/site packages/Flask_Admin-1.0.8-py2.6.egg/Flask_Admin/model/base.py”,第540行,在刷新缓存中
self.\u search\u supported=self.init\u search()
文件“/usr/lib/python2.6/site packages/Flask_Admin-1.0.8-py2.6.egg/Flask_Admin/contrib/sqla/view.py”,第410行,在初始搜索中
对于self中的列。\u获取\u列\u用于\u字段(p):
文件“/usr/lib/python2.6/site packages/Flask\u Admin-1.0.8-py2.6.egg/Flask\u Admin/contrib/sqla/view.py”,第390行,在\u字段的\u get\u列中
引发异常(“无效字段%s:不包含任何列”。%field)
异常:无效的字段站\u name:不包含任何列。
问题是:
在这种情况下,是否可以使用hybrid_属性,或者我应该尝试其他解决方案?
如果可能的话,我暂时不知道如何解决这些错误。这是最近在这个拉取请求中修复的:
现在,有一个使用混合属性的示例:第二个链接已断开。请查收。 File "/usr/lib/python2.6/site-packages/Flask_Admin-1.0.8-py2.6.egg/flask_admin/contrib/sqla/view.py", line 271, in __init__ super(ModelView, self).__init__(model, name, category, endpoint, url) File "/usr/lib/python2.6/site-packages/Flask_Admin-1.0.8-py2.6.egg/flask_admin/model/base.py", line 515, in __init__ self._refresh_cache() File "/usr/lib/python2.6/site-packages/Flask_Admin-1.0.8-py2.6.egg/flask_admin/model/base.py", line 540, in _refresh_cache self._search_supported = self.init_search() File "/usr/lib/python2.6/site-packages/Flask_Admin-1.0.8-py2.6.egg/flask_admin/contrib/sqla/view.py", line 410, in init_search for column in self._get_columns_for_field(p): File "/usr/lib/python2.6/site-packages/Flask_Admin-1.0.8-py2.6.egg/flask_admin/contrib/sqla/view.py", line 390, in _get_columns_for_field raise Exception('Invalid field %s: does not contains any columns.' % field) Exception: Invalid field station_name: does not contains any columns.