【发布时间】:2014-09-26 21:31:40
【问题描述】:
我想使用代表这些模型的 Flask、SQLAlchemy 和 WTForms 为多对多关系创建一个表单:
personaddress = db.Table('personaddress',
db.Column('person', db.Integer, db.ForeignKey('person.id')),
db.Column('address', db.Integer, db.ForeignKey('address.id'))
)
class Person(db.Model):
__tablename__ = "person"
id = db.Column(Integer, primary_key=True)
name = db.Column(String, nullable=False)
addresses = db.relationship('Address', secondary=personaddress, backref=db.backref('person', lazy='dynamic'))
class Address(db.Model):
__tablename__ = "address"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String, nullable=False)
要求
现在我想创建一个包含表单的单个页面,以实现以下目标:
- 添加/编辑/删除人员
- 添加/编辑/删除地址
- 添加/编辑/删除人员与地址之间的关系
重要要求:使用 QuerySelectField,我可以选择一个人的现有地址。但我想以相同的形式添加新地址。
我已经使用model_form 对主要模型和子表单使用FormField 作为连接表,但我只是不知道如何更新包括外键关系在内的所有内容。该页面应该为所有显示的表单和子表单提供一个提交按钮。
问题
- 上述要求通常如何在 Flask 中实现?
- Django 可以通过其管理界面更轻松地处理这种多对多场景吗?
【问题讨论】:
-
按照 Flask-SQLAlchemy 示例了解如何建立正确的多对多关系 (pythonhosted.org/Flask-SQLAlchemy/…),因为目前您还没有定义任何关系。然后使用 wtforms/flask-wtf 创建一个从
query_factory馈送的 QuerySelectField 以将您想要的对象 (stackoverflow.com/questions/17887519/…) 从您的对象中拉到您的表单中。 -
我添加了关系,但是单独使用 QuerySelectField 并不能满足要求。
-
您可以尝试使用 PonyORM 而不是 sqlalchemy 来执行此操作。这是他们的编辑器,因此您可以获得所需的所有正确输出PonyOrm
-
@boadescriptor,你能分享你使用的代码吗?
标签: python flask sqlalchemy flask-wtforms