如何使用ColanderAlchemy编辑现有记录?

时间:2012-11-04 07:05:26

标签: sqlalchemy colander colanderalchemy

我有一个像这样的SQLAlchemy模型:

class Group(Base):
    __tablename__ = 'groups'

    id = Column(Integer, primary_key = True, ca_include = True)
    name = Column(String, ca_include = True)

class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key = True, ca_include = True)
    name = Column(String, ca_include = True)
    group_id = Column(Integer, ForeignKey('groups.id'), nullable = True, ca_include = True)
    group = relationship('Group', ca_include = True)

我使用的表单库是变形的。我安装了ColanderAlchemy来自动将模型定义转换为Colander Schema:

form = deform.Form(SQLAlchemyMapping(Group), use_ajax = True)

我可以使用form.render()来获取一个空表单。但是如何用记录填充这个空表格呢? 我试过了:

group = Group.get(1)
form.render(group)

但失败了。 我也遵循这个blog,但它只能将单个记录转换为漏勺的格式,但不会转换任何关系。 那么......无论如何我是否将SQLAlchemy记录转换为Colander记录?

1 个答案:

答案 0 :(得分:3)

您需要利用与给定SQLAlchemyMapping架构对象关联的dictify方法将给定的模型实例转换为可接受的用于呈现Deform表单的appstruct。

因此,使用您的示例模型,您可能会这样做:

schema = SQLAlchemyMapping(Group)
form = deform.Form(schema, use_ajax=True)
my_group = Group(id=1, name='Foobar') #or query for an instance etc
appstruct = schema.dictify(my_group)
form.render(appstruct)

由于ColanderAlchemy在这个阶段非常具有前沿性,因此您的里程数可能会因较新版本而异(以上版本是针对0.1版本编写的),特别是因为它被大量重写以消除对自定义列和关系类型的需求版本0.2。我注意到当前的ColanderAlchemy 0.1b6版本存在问题 - 尤其是关于关系映射的问题。

有关最新版本的详细信息,请参阅http://colanderalchemy.rtfd.org/上的文档。