SQLAlchemy中具有多态性的自引用表

时间:2011-09-29 22:30:58

标签: python sqlalchemy

所以我现在对我的模型有问题。我遇到了这两个(1)(2)问题给了我很多帮助,但现在我被卡住了。这是我目前的代码:

class Post(Base):
    __tablename__ = 'post'
    id = Column(Integer, primary_key=True)
    type = Column('type', String(10))
    created = Column(TIMESTAMP(), default=datetime.now())
    updated = Column(TIMESTAMP(), default=datetime.now())
    poster_id = Column(Integer, ForeignKey('person.id'))
    poster = relationship('Person', backref=backref('posts'))
    __mapper_args__ = {'polymorphic_on': type}

class Comment(Post):
    __tablename__ = 'comment'
    __mapper_args__ = {'polymorphic_identity': 'comment', 'inherit_condition': (id == Post.id)}
    id = Column(Integer, ForeignKey('post.id'), primary_key=True)
    post_id = Column(Integer, ForeignKey('post.id'))
    post = relationship('Post', primaryjoin=('Comment.post_id == Post.id'), backref=backref('comments'), remote_side='Post.id')
    text = Column(Text)

我得到的当前错误是:

TypeError: Incompatible collection type: int is not list-like

我做错了什么?感谢。

1 个答案:

答案 0 :(得分:3)

id是列的一个非常不幸的名字; id是一个内置函数,因此总是定义。如果您为主键选择了一个不那么主流的名称,那么您会看到一个不同的错误,这很明显;

class Comment(Post):
    __tablename__ = 'comment'
    __mapper_args__ = {'polymorphic_identity': 'comment', 'inherit_condition': (id == Post.id)}
#                                                                               ^^

id引用__builtins__.id,这是一个返回python对象地址的函数。可能不是你的意思。

简易解决方案:将__mapper_args__移到您别名id的行下方,以表示您的实际表格列。