3

Flask-Admin で作成されたリスト ビューで、実際にはハイブリッド プロパティを使用してオブジェクト クラスで計算される sqlalchemy オブジェクトの 2 つの列を追加しました。


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'))
    [...]

そして、私の 2 つの「ハイブリッド列」が検索も並べ替えもできないという事実を除いて、すべて問題ありません。それらを 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__(モデル、名前、カテゴリ、エンドポイント、URL)
    ファイル "/usr/lib/python2.6/site-packages/Flask_Admin-1.0.8-py2.6.egg/flask_admin/model/base.py"、515 行目、__init__ 内
        self._refresh_cache()
    ファイル "/usr/lib/python2.6/site-packages/Flask_Admin-1.0.8-py2.6.egg/flask_admin/model/base.py"、540 行目、_refresh_cache 内
        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) の列の場合:
    ファイル "/usr/lib/python2.6/site-packages/Flask_Admin-1.0.8-py2.6.egg/flask_admin/contrib/sqla/view.py"、379 行目、_get_columns_for_field 内
        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 行目、__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__ 内
        return 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行目、操作中
        return op(self.comparator, *other, **kwargs)
    ファイル "/usr/lib/python2.6/site-packages/SQLAlchemy-0.9.6-py2.6-linux-x86_64.egg/sqlalchemy/sql/operators.py"、338 行目、__getitem__ 内
        return 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行目、操作中
        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 行目、__init__ 内
        super(ModelView, self).__init__(モデル、名前、カテゴリ、エンドポイント、URL)
    ファイル "/usr/lib/python2.6/site-packages/Flask_Admin-1.0.8-py2.6.egg/flask_admin/model/base.py"、515 行目、__init__ 内
        self._refresh_cache()
    ファイル "/usr/lib/python2.6/site-packages/Flask_Admin-1.0.8-py2.6.egg/flask_admin/model/base.py"、540 行目、_refresh_cache 内
        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) の列の場合:
    ファイル "/usr/lib/python2.6/site-packages/Flask_Admin-1.0.8-py2.6.egg/flask_admin/contrib/sqla/view.py"、390 行目、_get_columns_for_field 内
        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 に答える