我在 Pyramid 框架中工作,并使用Deform包在给定滤锅方案的情况下呈现 HTML 表单。我正在努力思考如何处理具有多对多关系的模式。例如,我的 sqlalchemy 模型如下所示:
class Product(Base):
""" The SQLAlchemy declarative model class for a Product object. """
__tablename__ = 'products'
id = Column(Integer, primary_key=True)
name = Column(String(80), nullable=False)
description = Column(String(2000), nullable=False)
categories = relationship('Category', secondary=product_categories,
backref=backref('categories', lazy='dynamic'))
class Category(Base):
""" The SQLAlchemy declarative model class for a Category object. """
__tablename__ = 'categories'
id = Column(Integer, primary_key=True)
name = Column(String(80), nullable=False)
products = relationship('Product', secondary=product_categories,
backref=backref('products', lazy='dynamic'))
product_categories = Table('product_categories', Base.metadata,
Column('products_id', Integer, ForeignKey('products.id')),
Column('categories_id', Integer, ForeignKey('categories.id'))
)
如您所见,这是一个非常简单的模型,表示产品可以属于一个或多个类别的在线商店。在我呈现的表单中,我希望有一个选择多个字段,我可以在其中选择几个不同的类别来放置产品。这是一个简单的滤锅模式:
def get_category_choices():
all_categories = DBSession.query(Category).all()
choices = []
for category in all_categories:
choices.append((category.id, category.name))
return choices
class ProductForm(colander.Schema):
""" The class which constructs a PropertyForm form for add/edit pages. """
name = colander.SchemaNode(colander.String(), title = "Name",
validator=colander.Length(max=80),
)
description = colander.SchemaNode(colander.String(), title="Description",
validator=colander.Length(max=2000),
widget=deform.widget.TextAreaWidget(rows=10, cols=60),
)
categories = colander.SchemaNode(
colander.Set(),
widget=deform.widget.SelectWidget(values=get_category_choices(), multiple=True),
validator=colander.Length(min=1),
)
而且,果然,我确实得到了所有字段的正确呈现,但是,类别字段似乎没有“绑定”到任何东西。如果我编辑我知道属于两个类别的产品,我希望选择字段已经突出显示这两个类别。进行更改(选择第三项)应导致数据库更改,其中 product_categories 具有给定 product_id 的三行,每行具有不同的 category_id。它可能是 TMI,但我也在使用类似于来读取/写入 appstruct。
现在,我已经看到提及(又一次使用 Mapping 来处理诸如此类的多对多关系字段,但是没有一个可靠的示例来说明如何使用它。
提前感谢任何可以伸出援助之手的人。将不胜感激。