如果 None 或 Null,则从查询中删除对象
Remove objects from query if None or Null
我正在尝试构建一个获取表单数据并删除任何 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)
因为它是允许用户过滤而不是显式搜索的页面后端,所以某些表单数据是空的。这导致查询搜索一种或多种形式 == None.
的结果
示例:用户在马力表中输入 100,将 RPM 和电压留空。查询 returns 即使有 100 马力的行也没有结果,因为它正在寻找 Horsepower == 100 和 RPM 和 Voltage == None 的行。
我试过使用 filter(None, object)
但没有成功,我认为解决方案可能在使用 kwargs
.
的某个地方
我知道我需要将所有表单数据传递给将删除 None
或 Null
条目的东西,然后将其传递给最终的 Motor.query.filter_by
参数,我只是不不知道怎么办。
您可以使用过滤数据创建 dict
:
filter_data = {'horsepower': horsepower, 'voltage': voltage, 'rpm': rpm}
然后创建另一个 dict
,仅包含值存在的键:
filter_data = {key: value for (key, value) in filter_data.items()
if value}
最后使用这个字典作为查询的关键字:
results = Motor.query.filter_by(**filter_data).all()
我正在尝试构建一个获取表单数据并删除任何 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)
因为它是允许用户过滤而不是显式搜索的页面后端,所以某些表单数据是空的。这导致查询搜索一种或多种形式 == None.
的结果示例:用户在马力表中输入 100,将 RPM 和电压留空。查询 returns 即使有 100 马力的行也没有结果,因为它正在寻找 Horsepower == 100 和 RPM 和 Voltage == None 的行。
我试过使用 filter(None, object)
但没有成功,我认为解决方案可能在使用 kwargs
.
我知道我需要将所有表单数据传递给将删除 None
或 Null
条目的东西,然后将其传递给最终的 Motor.query.filter_by
参数,我只是不不知道怎么办。
您可以使用过滤数据创建 dict
:
filter_data = {'horsepower': horsepower, 'voltage': voltage, 'rpm': rpm}
然后创建另一个 dict
,仅包含值存在的键:
filter_data = {key: value for (key, value) in filter_data.items()
if value}
最后使用这个字典作为查询的关键字:
results = Motor.query.filter_by(**filter_data).all()