4

我有一个带有Pageand的 wiki db 布局Revisions。每个 Revision 都有一个page_id引用页面,page与被引用页面的关系;每个页面all_revisions都与其所有修订版本相关。到目前为止很常见。

但我想为页面实现不同的时期:如果页面被删除并重新创建,新的修订版有一个新的epoch. 为了帮助找到正确的修订,每个页面都有一个current_epoch字段。现在我想revisions在页面上提供一个只包含其修订的关系,但只包含那些时代匹配的关系。

这是我尝试过的:

revisions = relationship('Revision',
    primaryjoin = and_(
        'Page.id == Revision.page_id',
        'Page.current_epoch == Revision.epoch',
    ),
    foreign_keys=['Page.id', 'Page.current_epoch']
)

完整代码(您可以按原样运行)

但是,这总是会引发ArgumentError: Could not determine relationship direction for primaryjoin condition ...`,我已经尝试了所有我想到的,它没有用。

我究竟做错了什么?这是一种不好的方法吗?除了建立关系之外,还能怎么做?

4

1 回答 1

4

创建两个类后尝试安装关系:

Page.revisions = relationship(
    'Revision',
    primaryjoin = (Page.id==Revision.page_id) & \
                    (Page.current_epoch==Revision.epoch),
    foreign_keys=[Page.id, Page.current_epoch],
    uselist=True,
)

顺便说一句,您的测试不正确:revisions属性从数据库加载数据,而您尚未将它们添加到会话中。

更新:代码中的问题是primaryjoin参数不是字符串,所以它没有被评估。使用字符串primaryjoin可以正常工作:

class Page(Base):
    # [skipped]
    revisions = relationship(
        'Revision',
        primaryjoin = '(Page.id==Revision.page_id) & '\
                        '(Page.current_epoch==Revision.epoch)',
        foreign_keys=[id, current_epoch],
        uselist=True,
    )
于 2010-05-31T08:39:54.710 回答