2012-10-13 2 views
2

SQLAlchemy 버전의 연결 목록을 만들어야합니다. 사실은 그보다 더 복잡하지만,이 귀결 : SQLAlchemy의 일대일 자체 관계

내가 필요 일대일, 자기 참조, 양방향 클래스에 관계. 모든 요소는 단 하나의 부모 만 가질 수도 있고 전혀 존재하지 않을 수도 있으며, 하나의 자식 만 가질 수도 있습니다.

class Node(declarative_base()): 
    __tablename__ = 'nodes' 

    id = Column(Integer, Sequence('nodes_id_seq'), primary_key=True, autoincrement=True) 
    value = Column(Integer) 
    prev_node_id = Column(Integer, ForeignKey('nodes.id')) 
    next = relationship('Node', uselist=False, backref=backref('prev', uselist=False)) 

을하지만, 내가 하나를 만들려고 할 때, 그것은 예외가 발생합니다 :

>>> Node() 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "<string>", line 2, in __init__ 
    File "sqlalchemy\orm\instrumentation.py", line 309, in _new_state_if_none 
    state = self._state_constructor(instance, self) 

[...] 

    File "sqlalchemy\orm\properties.py", line 1418, in _generate_backref 
    self._add_reverse_property(self.back_populates) 
    File "sqlalchemy\orm\properties.py", line 871, in _add_reverse_property 
    % (other, self, self.direction)) 
ArgumentError: Node.next and back-reference Node.prev are both of the same direction <symbol 'ONETOMANY>. Did you mean to set remote_side on the many-to-one side ? 

나는 여기에 놓치고 무엇을 그것은 다음과 같습니다 있도록

나는 내 수업을 단순화? Google 검색을 통해 절대적으로 아무데도 찾아 볼 수 없습니다./

답변

7

예외적으로 관계에 대해 remote_side 키워드를 설정해야합니다. 그렇지 않으면 sqlalchemy가 참조 방향을 선택할 수 없습니다.

class Node(declarative_base()): 
    ... 
    prev = relationship(
     'Node', 
     uselist=False, 
     remote_side=[id], 
     backref=backref('next', uselist=False) 
    ) 
+0

Node 클래스에 ID 테이블이 정의되어 있지 않지만 수퍼 클래스에 내 ID 테이블이 정의되어 있지 않은 경우 remote_side를 어떻게 설정합니까? – user1111652

+0

@ user1111652 Node.prev = relationship (..... remote_side = [Node.id] .....)와 같은 클래스 다음에 선언 할 수 있습니다 –

+0

또는 인용 된 표현식을 사용하여 나중에로드 할 수 있습니다 (" Node.id "대신 Node.id) –