我正在尝试将混合中的同义词用于声明性类模型。
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)
)时,我都会收到最大的递归错误。
我已经尝试了建议in this other question的解决方案,但我得到的是超出最大递归错误。
答案 0 :(得分:2)
Python将name mangling应用于以双下划线开头的类属性,并且强烈怀疑这是您问题的根源。
从列声明中删除其中一个下划线:
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))