SQLAlchemy,专用变量字段

SQLAlchemy,专用变量字段,sqlalchemy,Sqlalchemy,我正在使用一个带有属性和setter装饰器的类。我想知道为什么在下面的示例中必须引用私有变量名\u child,而不是child。在访问子对象时,我是否应该通过setter/getter间接访问\u child 下面是一个简单的例子: from sqlalchemy import Column, Integer, String, ForeignKey from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.o

我正在使用一个带有属性和setter装饰器的类。我想知道为什么在下面的示例中必须引用私有变量名
\u child
,而不是
child
。在访问
子对象时,我是否应该通过setter/getter间接访问
\u child

下面是一个简单的例子:

from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship

Base = declarative_base()

class Parent(Base):
    __tablename__ = 'parents'

    id = Column(Integer, primary_key=True)
    child = relationship('Child', back_populates='parent')
    child_id = Column(Integer,ForeignKey('child.id'))
    def __init__(self):
        self._child= Child()

    @property
    def child(self):
        return self._child

    @child.setter
    def child(self, child):
        print('child set')
        self._child= child

class Child(Base):
    __tablename__ = 'child'
    id = Column(Integer, primary_key=True)

    parent = relationship('Parent', back_populates='child')

    def __init__(self):
        pass

if __name__ == '__main__':
    child = Child()
    parent = Parent()
    parent.child = child
这会引发以下错误:
sqlalchemy.exc.InvalidRequestError:Mapper'Mapper | Parent | parents'没有属性“child”

如果我替换

child = relationship('Child', back_populates='parent')
# and
parent = relationship('Parent', back_populates='child')


一切正常

您正在使用同名的
属性来隐藏关系
子对象
。这与您根本没有关系一样,因此
back\u populates=“child”
找不到名为
child
的关系,因为它不存在


仅从您的示例来看,您根本不需要
属性

我不确定我是否理解您的要求。如果您编写
child=relationship…
您将对
child
属性进行阴影处理。我假定您不能拥有
child=relationship..
,并且必须拥有
\u child=relationship..
。我尝试了前者,但这里描述了一个错误:您需要提供一个最小的示例。不清楚您是否使用
关系跟踪
属性
,反之亦然。在这两种情况下,它们彼此冲突,因为它们有相同的名称。同样,不清楚您的实际问题是什么。添加了一个最小的工作示例。
_child = relationship('Child', back_populates='parent')
# and
parent = relationship('Parent', back_populates='_child')