【问题标题】:SQLAlchemy and Pyramid, how to get resources out of context?SQLAlchemy 和 Pyramid,如何让资源脱离上下文?
【发布时间】:2012-01-15 16:58:28
【问题描述】:

我在处理我的 Pyramid Web 应用程序时遇到了问题。我的结构非常类似于 Michael Merickel here 所描述的结构,除了我使用纯遍历来查找我的视图。 (它们被声明为配置了 context='path.toResource' name='myView'),根据我从traversal wiki tutorial. 可以看出的相当标准的票价虽然我的应用程序具有更复杂的 URL 结构:我的用户资源在 @ 987654323@ 和我的项目在/projects/{project_id} 下。我的所有资源都使用 SQLAlchemy ORM 进行持久化;我有一个带有__name____parent__ 属性的用户和项目类,以及扩展列的其他属性。

class User(Base):
    id = Column(...)
    __name__ = None
    __parent__ = None
Class Project(Base):
    id = Column(...)
    __name__ = None
    __parent__ = None
    owner_id = Column(...ForeignKey(User.id))
    owner = relationship(User,...)

我有一个 RootFactory、ProjectFactory 和 UserFactory,它们在 __get_item__ 调用中填充了适当的 __name____parent__ 属性。

因此,在 Project 上下文的视图函数中,我在 request.context 中获得了一个 Project 实例。我的问题是如何引用相应的用户实例?我不能做 project.owner,因为那个 User 实例没有通过 RootFactory 链,所以它的 __parent____name__ 值没有设置。这很糟糕,因为我想使用 request.resource_url 找到所有者用户的 URL,所以我可以在查看页面上放一个链接。

这里的解决方案是什么?我是否通过 request.root 完成所有操作?如果我想创建一个返回 User 或 Project 实例的复杂查询怎么办?是否有某种 CrapFactory 我可以通过 SQLAlchemy 以便正确填充其所有实例?

我的方法完全错误吗?

如果我只是坚持使用 URL 路由,我觉得我不会遇到这些问题......

【问题讨论】:

    标签: python sqlalchemy url-routing pyramid


    【解决方案1】:

    这是每个人在尝试将 SQLAlchemy 与遍历混合时都会遇到的问题。遍历的要求是具有持久的树结构,您可以遍历该结构以从一个节点到另一个节点。

    你基本上有两个选择。

    1. 您可以在数据库中构建一个实际的树,每个资源都知道它所在的位置。因此,当您加载资源时,它可以通过某种方式确定其父级和名称。这是最好的选择。这通常通过在数据库中创建自引用资源表来完成。然后,您的 UserProject 对象都将具有 resource_id 外键,它们可以用来确定它们在树中的位置。

    2. 目前仅当您从根遍历树时才会填充您的姓名和父级,因此您可以通过 request.root 执行所有操作以引用树的其他部分。

    也可以在每个资源上只定义一个__resource_url__ 属性,但在大多数情况下这也是相当的。

    要带走的一点是,说“我的 url 具有这种结构”和实际构建一个您可以使用的该结构的持久层次结构有很大的不同。处理 URL 相当简单,但如果没有持久树,生成它们可能会很痛苦。

    【讨论】:

    • 我希望有某种方法可以将我的资源的 URL 表示与资源本身分离……如果我可以将某个工厂声明为特定类型的所有实例的容器,那就太好了,并让 Pyramid 处理其余部分。哦,好吧...
    • 遍历的定义是被遍历的资源与URL表示耦合。
    • 您当然可以将“模型”对象包装在实际处理 URL 内容的“资源”对象中,但是您仍然会遇到当前在某处没有持久树的问题。对于尝试遍历的人来说,这是一个非常普遍的问题。某处需要有一个持久树,否则生成 URL/资源会很痛苦。
    • 如果我希望请求确定资源父级,我是否坚持使用根目录?我希望能够从 /project/{id} 以及 /p/{short_url} 访问我的项目
    • 这是持久化树的点。当您的资源与其父级绑定(而不是通过遍历生成)时,您可以从数据库中加载资源及其父级,而无需关心它在树中的位置。制作可重定位资源超出了这个 SO 问题的范围,也不是我要在评论框中回答的主题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    相关资源
    最近更新 更多