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) 

因爲它是一個頁面,讓用戶過濾器,而不是明確的搜索後臺,某種形式的數據是空的。這導致查詢搜索一個或多個表單== None的結果。

示例:用戶在馬力表格中輸入100,RPM和電壓保持空白。即使有100馬力的行,查詢也不會返回任何結果,因爲它正在查找行數,其中馬力== 100,RPM和電壓==無。

我試過用filter(None, object)沒有成功,並認爲解決方案可能在某個地方使用kwargs

我知道我需要將所有表單數據傳遞給將刪除NoneNull條目的東西,然後將它傳遞給最終的Motor.query.filter_by參數,我只是不知道如何。

回答

2

您可以創建一個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() 
+0

謝謝!這真的幫我弄明白了。我只是很難理解filter_by()參數如何能夠理解kwarg並以正確的格式解釋它,即使它是字典?這是SQLAlchemy的一個特性,能夠將字典翻譯爲模型,反之亦然? – xGlorify

+1

不,它實際上是一個將參數傳遞給函數的Python特性。瞭解更多信息:http://pythontips.com/2013/08/04/args-and-kwargs-in-python-explained/ –

相關問題