带有SQLAlchemy的烧瓶持久保存大表格(新手)

时间:2018-10-24 02:33:35

标签: python flask flask-sqlalchemy flask-wtforms

我正在编写很多样板代码,以尝试保留表单数据。在其他语言中,保存之前我不必手动将form属性映射到模型,我想知道python / flask是否具有类似的方法?理想情况下,我更希望手动映射所有表单字段以简单地保留数据库记录。

[编辑] 需要明确的是,这种方法对我来说很好,记录可以正确保存,但是效率似乎很低。在另一段代码中,我能够使用wtf库{{ wtf.quick_form(form) }} 创建一个html表单而不显式列出其所有字段的表单。鉴于我的模型属性名称与表单属性的名称相同,我想知道是否可以这样做? [编辑]

任何反馈

下面的例子。

我有一个比较大的型号“产品”

class Product(db.Model):
    field1 = db.Column(db.String(200))
    field2 = db.Column(db.String(200))
    ....
    field30 = db.Column(db.String(200))

以烧瓶形式表示,例如

class ProductForm(FlaskForm):
   field1 = StringField('Field 1', validators=[DataRequired()])
   field2 = TextAreaField('Field 2 Label')
   field30 = TextAreaField('Field 30 Label')
   submit = SubmitField('Submit')

我在这里尝试映射并保留产品记录...

def save_product(self, product, form):
    product.field1 = form.field.data
    #lots more tedious form to model mapping
    db.session.add(product)
    # commit the data to the database
    db.session.commit()

在我的route.py中,我有以下内容。我看到它被调用,并且记录确实存在。

def crud():
    form = CrudForm()
    if form.validate_on_submit():
        product = Product()
        product.save_product(product, form, new=True)
        flash(_('Product Saved'))
        return redirect(url_for('main.index'))

    return render_template('crud.html', title=_('Product CRUD'),
                           form=form)

1 个答案:

答案 0 :(得分:0)

鉴于表单字段的名称与数据库列的名称相同,因此可以简化模板。表单中所有字段的字典都可以作为form.data属性访问,并且在创建模型的新实例时可以直接将其作为关键字参数传递,而不是随后一次设置它们。

product = Product(**form.data)