0

宣言型クラスモデルのミックスインで同義語を使用しようとしています。

class MyMixin(object):

    __my_field = Column(Boolean, name='my_field', index=True, default=True)

    def __get_my_field(self):
        return self.__my_field

    @declared_attr
    def my_field(cls):  # @NoSelf
        return synonym('__my_field', descriptor=property(cls.__get_my_field))    


Base = declarative_base(cls=MyMixin)


class Model(Base):

    __tablename__ = 'model'

    value = Column(String)

コードは正常に起動しますが、そのフィールド()でクエリを実行しようとするとsession.query(Model).filter(Model.my_field==True)、最大再帰エラーが発生します。

この他の質問で提案された解決策を試しましたが、得られるのは最大再帰超過エラーだけです。

4

1 に答える 1

2

Pythonは、二重アンダースコアで始まるクラス属性に名前マングリングを適用します。これがここでの問題の根本であると強く思います。

列宣言から下線の1つを削除します。

class MyMixin(object):

    __my_field = Column(Boolean, name='my_field', index=True, default=True)

    def _get_my_field(self):
        return self._my_field

    @declared_attr
    def my_field(cls):  # @NoSelf
        return synonym('_my_field', descriptor=property(cls._get_my_field))    
于 2012-11-13T16:07:31.933 に答える