2017-02-09 3 views
0

Я использую класс с декораторами свойств и сеттера. Мне интересно, почему я должен ссылаться на имя частной переменной _child вместо child в приведенном ниже примере. Разве я не должен косвенно обращаться к _child через сеттер/геттер при доступе к childSQLAlchemy, поля для частных переменных

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') 

все работает

+0

Я не уверен, что понимаю, что вы просите. Если вы напишете «child = relationship ...», вы закроете свойство 'child'. – univerio

+0

Я предполагаю, что вы не можете иметь 'child = relationship..' и должны иметь' _child = relationship..'. Я попробовал первый и получил ошибку, описанную здесь: http://stackoverflow.com/questions/42139767/sqlalchemy-exc-invalidrequesterror-mapper-has-no-property – nven

+0

Вам нужно будет предоставить минимальный пример. Неясно, скрываете ли вы «свойство» с «отношением» или наоборот. В любом случае они конфликтуют друг с другом, потому что у них одно и то же имя. Опять же, неясно, каков ваш фактический вопрос. – univerio

ответ

0

Вы затенения отношения child с property того же имени. Это то же самое, как если бы у вас вообще не было отношений, поэтому back_populates="child" не может найти связь под названием child, потому что ее не существует.

Судя по вашему примеру, вам не нужен только property.

Смежные вопросы