python - 如果 None 或 Null,则从查询中删除对象

标签 python postgresql flask-sqlalchemy dynamicquery dynamic-queries

我正在尝试构建一个查询,该查询采用表单数据并删除任何 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 和电压留空。即使存在具有 100 马力的行,该查询也不会返回任何结果,因为它正在查找马力 == 100 且 RPM 和电压 == 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}

最后使用这个字典作为查询的 kwargs:

results = Motor.query.filter_by(**filter_data).all()

关于python - 如果 None 或 Null,则从查询中删除对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35097921/

相关文章:

python - 如何从linux程序逐行将输入管道输入到python?

flask - 如何正确设置 Flask + uWSGI + SQLAlchemy 以避免数据库连接问题

postgresql - 表删除后重置 ID 计数()

sql - PK 顺序索引的填充因子

PostgreSQL,Npgsql 返回 42601 : syntax error at or near "$1"

php - 查询中的问号运算符

python - Flask-sqlalchemy:无法将属性字段作为关键字参数提供给构造函数

python - 遍历堆化列表

python - 在anaconda python中保存动画文件时出现"IOError: [Errno 32] Broken pipe"

python - 检查函数是否被调用