SQLAlchemy和Pyramid,如何从上下文中获取资源?

fra*_*ank 5 python sqlalchemy url-routing pyramid

我在Pyramid Web应用程序中缠绕问题时遇到了问题.我的结构非常类似于迈克尔·梅里克尔在这里描述的结构,除了我使用纯粹的遍历来找到我的观点.(它们被声明配置为context ='path.toResource'name ='myView'),根据我从遍历wiki教程中可以看到的相当标准的票价.我的应用程序有一个更复杂的URL结构:我的用户资源不足/users/{user_id},我的项目在/projects/{project_id}.我的所有资源都使用SQLAlchemy ORM保留; 我有一个带有__name____parent__属性的User和Project类,以及扩展Columns的其他属性.

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,...)
Run Code Online (Sandbox Code Playgroud)

我有一个RootFactory,ProjectFactory和UserFactory,用于填充调用中的相应属性__name____parent__属性__get_item__.

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

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

我的做法完全错了吗?

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

Mic*_*kel 5

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

你基本上有2个选择.

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

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

也可以__resource_url__在每个资源上定义一个属性,但对于大多数情况来说这也是相当hackish.

要带走的是,与"我的网址具有此结构"并实际构建您可以使用的结构的持久层次结构存在很大差异.对于处理URL来说,它非常简单,但是为了生成它们,没有持久树就会很痛苦.