[英]Create an empty SQLAlchemy query as a base for searching a model
我想基於多個條件搜索模型。 用戶輸入搜索詞並選擇要搜索的字段。 如果未選擇任何字段,我想返回一個空結果。 如何創建一個空的查詢對象? 還是有更好的方法來構造它?
results = *an empty query object*
if nameChecked:
nameResults = System.query.filter(System.system_name.contains(searchTag))
results = results.union(nameResults)
if descriptionChecked:
descriptionResults = System.query.filter(System.system_description.contains(searchTag))
results = results.union(descriptionResults)
if tagsChecked:
tagsResults = System.query.filter(System.system_tags.contains(searchTag))
results = results.union(tagsResults)
與其為每個字段獲取單獨的檢查值,不如使用多個具有不同值但名稱相同的復選框來獲取要過濾的字段列表。
檢查是否未選擇任何字段,如果是,則返回一個空列表。 否則,請收集過濾器列表,或or_
它們在一起。 在這種情況下,不需要union
。
<form>
<input name="q">
<input type="checkbox" name="field" value="name">
<input type="checkbox" name="field" value="description">
<input type="checkbox" name="field" value="tags">
<input type="submit">
</form>
{% if results %}
output the results
{% endif %}
@app.route('/search')
def search():
value = request.args['q']
fields = set(request.args.getlist('field'))
if not fields:
return render_template('search.html', results=[])
filters = []
if 'name' in fields:
filters.append(System.name.contains(value))
if 'description' in fields:
filters.append(System.description.contains(value))
if 'tags' in fields:
filters.append(System.tags.contains(value))
results = System.query.filter(db.or_(*filters)).all()
return render_template('search.html', results=results)
您可能會更聰明地使用字典並壓縮過濾器,但是效率可能較低。
results = System.query.filter(db.or_(*(value for key, value in {
'name': System.name.contains(value),
'description': System.description.contains(value),
'tags': System.tags.contains(value)
}.items() if key in fields))).all() if fields else []
如果您確實需要一個空查詢而不是一個空結果,則可以使用System.query.filter(False)
。 這用途有限,因為之后您無法對查詢執行任何操作,所有過濾器都會被忽略。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.