3

在使用 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_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)

因此,我将它们添加到列表视图中:


class MyClassView(ModelView):
    list_template = 'some/template.html'
    column_list = ('column1','column2','state','station_name')
    column_searchable_list = ('column1','column2')
    column_formatters = dict(state=macro('macro_in_my_template'))
    [...]

一切都很好,除了我的两个“混合列”不可搜索也不可排序。如果我将它们添加到 column_searchable_list 中,我会得到:

“状态”属性:

    文件“/usr/lib/python2.6/site-packages/Flask_Admin-1.0.8-py2.6.egg/flask_admin/contrib/sqla/view.py”,第 271 行,在 __init__
        super(ModelView, self).__init__(model, name, category, endpoint, url)
    __init__ 中的文件“/usr/lib/python2.6/site-packages/Flask_Admin-1.0.8-py2.6.egg/flask_admin/model/base.py”,第 515 行
        self._refresh_cache()
    _refresh_cache 中的文件“/usr/lib/python2.6/site-packages/Flask_Admin-1.0.8-py2.6.egg/flask_admin/model/base.py”,第 540 行
        self._search_supported = self.init_search()
    文件“/usr/lib/python2.6/site-packages/Flask_Admin-1.0.8-py2.6.egg/flask_admin/contrib/sqla/view.py”,第 410 行,在 init_search
        对于 self._get_columns_for_field(p) 中的列:
    _get_columns_for_field 中的文件“/usr/lib/python2.6/site-packages/Flask_Admin-1.0.8-py2.6.egg/flask_admin/contrib/sqla/view.py”,第 379 行
        attr = getattr(self.model, field, None)
    文件“/usr/lib/python2.6/site-packages/SQLAlchemy-0.9.6-py2.6-linux-x86_64.egg/sqlalchemy/ext/hybrid.py”,第 738 行,在 __get__
        返回 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 行,在 __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行,运行
        返回 op(self.comarator, *other, **kwargs)
    文件“/usr/lib/python2.6/site-packages/SQLAlchemy-0.9.6-py2.6-linux-x86_64.egg/sqlalchemy/sql/operators.py”,第 338 行,在 __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行,在操作
        引发 NotImplementedError(str(op))
        未实现错误:

'station_name' 属性:

    文件“/usr/lib/python2.6/site-packages/Flask_Admin-1.0.8-py2.6.egg/flask_admin/contrib/sqla/view.py”,第 271 行,在 __init__
        super(ModelView, self).__init__(model, name, category, endpoint, url)
    __init__ 中的文件“/usr/lib/python2.6/site-packages/Flask_Admin-1.0.8-py2.6.egg/flask_admin/model/base.py”,第 515 行
        self._refresh_cache()
    _refresh_cache 中的文件“/usr/lib/python2.6/site-packages/Flask_Admin-1.0.8-py2.6.egg/flask_admin/model/base.py”,第 540 行
        self._search_supported = self.init_search()
    文件“/usr/lib/python2.6/site-packages/Flask_Admin-1.0.8-py2.6.egg/flask_admin/contrib/sqla/view.py”,第 410 行,在 init_search
        对于 self._get_columns_for_field(p) 中的列:
    _get_columns_for_field 中的文件“/usr/lib/python2.6/site-packages/Flask_Admin-1.0.8-py2.6.egg/flask_admin/contrib/sqla/view.py”,第 390 行
        raise Exception('无效字段 %s: 不包含任何列。' % field)
        例外:无效字段 station_name:不包含任何列。

问题是:在这种情况下是否可以使用 hybrid_property 或者我应该尝试不同的解决方案?如果可能的话,我目前不知道如何解决这些错误。

4

1 回答 1

3

这是最近在此拉取请求中修复的:https ://github.com/flask-admin/flask-admin/pull/962

现在,有一个使用混合属性的示例:https ://github.com/flask-admin/flask-admin/blob/master/examples/sqla-hybrid_property/app.py

于 2015-10-05T01:15:30.663 回答