Python SQLAlchemy:关于自引用关系(错误:无属性';_sa_实例';)

Python SQLAlchemy:关于自引用关系(错误:无属性';_sa_实例';),python,sql,orm,sqlalchemy,pyramid,Python,Sql,Orm,Sqlalchemy,Pyramid,我想实现一些many-to-many和self-referential映射,就像关键字网中的关键字图一样。例如,“苹果”是“多汁水果”的后代,同时,“苹果”是许多“特定种类苹果”的父母,而“多汁水果”,当然也有许多父母喜欢“可食用的东西”。简言之,是一种多对多关系。而且,它们都是关键字类的实例(自引用)。我将其定义如下: kw2kw_table=Table('kw2kw_table',Base.metadata, Column('child_id',Integer,F

我想实现一些
many-to-many
self-referential
映射,就像
关键字网中的关键字图一样。例如,“苹果”是“多汁水果”的后代,同时,“苹果”是许多“特定种类苹果”的父母,而“多汁水果”,当然也有许多父母喜欢“可食用的东西”。简言之,是一种多对多关系。而且,它们都是关键字类的实例(
自引用
)。我将其定义如下:

kw2kw_table=Table('kw2kw_table',Base.metadata,
              Column('child_id',Integer,ForeignKey('kw_table.id'),primary_key=True),
              Column('parent_id',Integer,ForeignKey('kw_table.id'),primary_key=True),
             )

class KW(Base):
    __tablename__='kw_table'
    id=Column(Integer,primary_key=True)
    name=Column(Unicode(28),unique=True)
    parents=relationship('KW',
                 secondary=kw2kw_table,
                 primaryjoin=id==kw2kw_table.c.child_id,
                 secondaryjoin=id==kw2kw_table.c.parent_id,
                 backref='children',
                 )
    def __init__(self,name,parent=None):
        self.name=name
        self.children=[]
        if parent==None: #default to a root keyword
            self.parents.append(self)
        else:
            self.parents.append(parent)
在我的视图文件中:

...   
    keywordName = request.params['keyword']
    parentName = request.params.get('parent',u'')
    if parentName:
        parent=DBSession.query(KW).filter(KW.name==parentName)
        if parent: #if parent exists
            new_kw=KW(keywordName,parent)
        else:
            parent=KW(parentName)
            new_kw=KW(keywordName,parent)
    else: #if the parent was not provided
        new_kw=KW(keywordName)
    DBSession.add(new_kw)
...
但是,当使用
(关键字,父项)
提交视图时,我得到了一个错误:

File "build/bdist.macosx-10.6-intel/egg/sqlalchemy/orm/attributes.py", line 910, in fire_append_event
value = fn(state, value, initiator or self)
File "build/bdist.macosx-10.6-intel/egg/sqlalchemy/orm/attributes.py", line 1138, in emit_backref_from_collection_append_event
child_state, child_dict = instance_state(child), \
AttributeError: 'Query' object has no attribute '_sa_instance_state'
我瞎看了一下,但没弄明白。请帮忙

----------更新------------------------ 详情:

您需要调用查询以便返回实例,此时您正在将查询对象传递给会话:

parent=DBSession.query(KW).filter(KW.name==parentName).first()

非常感谢。错误消失了,我在
parent=KW(parentName)
行之间添加了
DBSession.add(parent)
。但它仍然不起作用(在我提交数据后,新的关键字没有提交)。。。似乎
\uuuu init\uuuu
没有达到我的预期。您正在刷新/提交会话吗?再次感谢您的回复。Pyramid doc说“Pyramid负责提交:它在请求结束时提交,或者在出现异常时中止。”无论如何,即使我手动刷新,它也不起作用。我已经在这里粘贴了控制台输出:您的pyramid.includes文件中是否有“pyramid_tm”?这就是在web请求结束时自动提交的神奇模块。