Я использую класс с декораторами свойств и сеттера. Мне интересно, почему я должен ссылаться на имя частной переменной _child
вместо child
в приведенном ниже примере. Разве я не должен косвенно обращаться к _child
через сеттер/геттер при доступе к child
SQLAlchemy, поля для частных переменных
Minimal пример ниже:
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' has no property 'child'
Если я заменяю
child = relationship('Child', back_populates='parent')
# and
parent = relationship('Parent', back_populates='child')
с
_child = relationship('Child', back_populates='parent')
# and
parent = relationship('Parent', back_populates='_child')
все работает
Я не уверен, что понимаю, что вы просите. Если вы напишете «child = relationship ...», вы закроете свойство 'child'. – univerio
Я предполагаю, что вы не можете иметь 'child = relationship..' и должны иметь' _child = relationship..'. Я попробовал первый и получил ошибку, описанную здесь: http://stackoverflow.com/questions/42139767/sqlalchemy-exc-invalidrequesterror-mapper-has-no-property – nven
Вам нужно будет предоставить минимальный пример. Неясно, скрываете ли вы «свойство» с «отношением» или наоборот. В любом случае они конфликтуют друг с другом, потому что у них одно и то же имя. Опять же, неясно, каков ваш фактический вопрос. – univerio