SQLAlchemy,专用变量字段
我正在使用一个带有属性和setter装饰器的类。我想知道为什么在下面的示例中必须引用私有变量名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
\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')