2

我正在尝试构建一个获取表单数据并删除任何None" "提交的查询,但我不确定如何处理逻辑。这是代码;

@app.route('/filterassets', methods=['GET', 'POST'])
def searchassets():
form = FilterAssetsForm()
results = None
if request.method == "POST":
    if form.validate_on_submit():
        try:
            horsepower = form.horsepower_search.data
            voltage = form.voltage_search.data
            rpm = form.rpm_search.data
            results = Motor.query.filter_by(horsepower=horsepower, voltage=voltage, rpm=rpm).all()
        except Exception as e:  
            flash(e)
            db.session.rollback()
        return render_template('filterassets.html', form=form, results=results)
return render_template('filterassets.html', form=form)

因为它是允许用户过滤而不是显式搜索的页面后端,所以某些表单数据是空的。这导致查询搜索一个或多个表单 == 无的结果。

示例:用户在马力表格中输入 100 并将 RPM 和电压留空。即使有 100 马力的行,该查询也不会返回任何结果,因为它正在寻找马力 == 100 且 RPM 和电压 == 无的行。

我试过使用filter(None, object)没有成功,并认为解决方案可能在使用kwargs.

我知道我需要将所有表单数据传递给将要删除NoneNull条目的东西,然后将其传递给最后一个Motor.query.filter_by参数,我只是不知道如何。

4

1 回答 1

3

您可以dict使用过滤器数据创建一个:

filter_data = {'horsepower': horsepower, 'voltage': voltage, 'rpm': rpm}

然后创建另一个dict只有值存在的键:

filter_data = {key: value for (key, value) in filter_data.items()
               if value}

最后使用这个 dict 作为你的查询的 kwargs:

results = Motor.query.filter_by(**filter_data).all()
于 2016-01-30T04:37:21.743 回答