1

フロントエンド開発用の API を作成していますが、モデル内のオブジェクトに問題があります。私はflask-sqlalchemypython2.7を使用しています

manager = flask_restless.APIManager(app, session = s)
manager.create_api(Basic_Abones)

ORM モデル

class Basic_Abones(Base):
    __tablename__ = 'basic_abones'
    id = Column(Integer, primary_key=True)
    name = Column(String(120))
    part = Column(Integer)
    current_price = Column(Integer)
    complex_a = relationship("Complex_Abon", secondary=assoc, back_populates='basic')
    discount = Column(Integer)


    def __repr__(self):
        return self.name

    @hybrid_property
    def price_with_discount(self):
        try:
            return self.current_price * self.discount / 100

        except TypeError:
            return 0 

例外

127.0.0.1 - - [09/Jan/2018 13:10:04] "GET / HTTP/1.1" 200 -
--------------------------------------------------------------------------------
ERROR in views [/home/yozh/AllStars/allstars/local/lib/python2.7/site-packages/flask_restless/views.py:1178]:
Neither 'hybrid_property' object nor 'ExprComparator' object associated with Basic_Abones.price_with_discount has an attribute 'property'
--------------------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/yozh/AllStars/allstars/local/lib/python2.7/site-packages/flask_restless/views.py", line 1172, in _search
    result = search(self.session, self.model, search_params)
  File "/home/yozh/AllStars/allstars/local/lib/python2.7/site-packages/flask_restless/search.py", line 587, in search
    query = create_query(session, model, search_params, _ignore_order_by)
  File "/home/yozh/AllStars/allstars/local/lib/python2.7/site-packages/flask_restless/search.py", line 549, in create_query
    _ignore_order_by)
  File "/home/yozh/AllStars/allstars/local/lib/python2.7/site-packages/flask_restless/search.py", line 505, in create_query
    pks = primary_key_names(model)
  File "/home/yozh/AllStars/allstars/local/lib/python2.7/site-packages/flask_restless/helpers.py", line 216, in primary_key_names
    and isinstance(field.property, ColumnProperty)
  File "/home/yozh/AllStars/allstars/local/lib/python2.7/site-packages/sqlalchemy/orm/attributes.py", line 314, in __getattr__
    attribute)
AttributeError: Neither 'hybrid_property' object nor 'ExprComparator' object associated with Basic_Abones.price_with_discount has an attribute 'property'
127.0.0.1 - - [09/Jan/2018 13:10:14] "GET /api/basic_abones HTTP/1.1" 400 -

私は何が起こるかわからないし、Googleで解決されたものを見つけることができません. ありがとう、私の英語でごめんなさい

PS: このフラスコ プラグインは、モデルにハイブリッド プロパティがなくても正常に動作しますが、私のプロジェクトにとってはハイブリッド列が重要です

4

1 に答える 1

0

どうやら、これはFlask-Restlessプロジェクトの既知のバグであり、flask-sqlalchemy のバグではありません。

マスター ブランチでは既に修正されていますが、解決策を実装した現在の安定版はありません。

問題の根本的な原因は、フラスコ レストレスの helpers.py ファイルの「primary_key_names」にあります。このファイルは、hybrid_property オブジェクトのプロパティと呼ばれるフィールドにアクセスしようとします。存在しないため、例外が発生します。

可能な解決策:

  1. Flask-Restless の master ブランチに依存関係を設定します。このソリューションは、多少一時的なものであるため、IMO としてはあまり適切ではありません (将来の変更によってコードが壊れる可能性があります)。
  2. リポジトリをフォークし、元のgithub issueで提案されたソリューションを実装します。
  3. 私の側で実装することを選択した解決策は、コードの問題を回避することです。不足しているプロパティ属性へのアクセスが例外を引き起こす場合は、次のように、hybrid_propery でプロパティ フィールドを設定します。

    @hybrid_property
    def key_id(self):
        return int(self.key.split('-')[1])
    
    @key_id.expression
    def key_id(cls):
        return cast(func.split_part(cls.key, '-', 2), Integer)
    
    key_id.__setattr__("property", "None")
    
于 2020-03-02T10:29:12.690 に答える