5

我想在同一张表中有父子关系。以下是我所拥有的,但它不起作用。通过“不工作”,我的意思是当我调用.children某个Item对象时,它给了我[]. 我的代码中有什么错误以及如何正确执行?谢谢。

parents_children = Table('parents_children', Base.metadata,
                         Column('parent_id', bigint, ForeignKey('items.id', name='a'), primary_key=True),
                         Column('child_id', bigint, ForeignKey('items.id', name='b'), primary_key=True)
                         )

class Item(Base):
    __tablename__ = 'items'
    id = Column(bigint, primary_key=True, autoincrement=True)
    name = Column(types.String(80), default="")
    display_name = Column(types.String(80), default="")
    version = Column(types.String(80), default="")
    discriminator = Column(item_tag_enum, nullable=False)
    children = relationship('Item',
                            secondary=parents_children,
                            primaryjoin=id == parents_children.c.parent_id,
                            secondaryjoin=id == parents_children.c.child_id,
                            backref='parents')
    __mapper_args__ = {'polymorphic_on' : discriminator}

 # Item subclasses omitted because that's irrelevant to the question.
4

2 回答 2

2

我认为有一种更简单的方法......(我就是这样做的)

def adopt(parent_id,child_id):
    parent = DBSession.query(Item).get(parent_id)
    child  = DBSession.query(Item).get(child_id)
    parent.children.append(child)
于 2012-10-16T10:01:32.167 回答
0

好的,问题解决了。

我正在创建一个插入语句对象但没有执行它。

我有什么:

def adopt(parent_id, child_id):
    print('{} adopts {}'.format(parent_id, child_id))
    parents_children.insert(values=dict(parent_id=parent_id, child_id=child_id))

我现在拥有的:

def adopt(parent_id, child_id):
    print('{} adopts {}'.format(parent_id, child_id))
    i = parents_children.insert(values=dict(parent_id=parent_id, child_id=child_id))
    conn = engine.connect()
    conn.execute(i)

现在一切都按预期工作。

所以问题出在我在原始帖子中包含的片段之外的其他地方。请随时删除问题。

于 2012-10-16T08:43:19.590 回答