Flask 烧瓶-SQLAlchemy-使用过滤器进行高级搜索
我正在使用一系列过滤器和html选择下拉列表来尝试创建高级搜索。我希望用户能够选择各种领域,他们希望搜索和获得结果。如果我在下面的views.py中只有4个字段是“query”的活动字段,但超过4个字段没有返回结果,因为没有任何记录满足所有过滤器字段值,那么我可以让“search”(即复杂过滤器)工作。我知道会发生的 因此,我一直在试图找出如何创建一个“-All--”选项,以便用户可以选择他们最感兴趣的属性,以及他们希望“查询”忽略的属性 views.py(截断版本有多个字段可供搜索) search_advanced.htmlFlask 烧瓶-SQLAlchemy-使用过滤器进行高级搜索,flask,html-select,flask-sqlalchemy,flask-wtforms,Flask,Html Select,Flask Sqlalchemy,Flask Wtforms,我正在使用一系列过滤器和html选择下拉列表来尝试创建高级搜索。我希望用户能够选择各种领域,他们希望搜索和获得结果。如果我在下面的views.py中只有4个字段是“query”的活动字段,但超过4个字段没有返回结果,因为没有任何记录满足所有过滤器字段值,那么我可以让“search”(即复杂过滤器)工作。我知道会发生的 因此,我一直在试图找出如何创建一个“-All--”选项,以便用户可以选择他们最感兴趣的属性,以及他们希望“查询”忽略的属性 views.py(截断版本有多个字段可供搜索) sear
{% extends "layout.html" %}
{% block content %}
<div class="container">
<h1>Advanced Search</h1>
<form method="POST" action="search_advanced">
<div class="advanced">
<!--Select species stratum-->
<label for="stratum"><p class="advanced">Lifeform</p></label>
<select name="stratum" id="stratum">
<option value= ""> -- All -- </option> <!-- Need to figure out how to pass an all option-->
<option value="Graminoid">Graminoid</option>
<option value="Forb">Forb</option>
<option value="Subshrub">Sub-Shrub</option>
<option value="Shrub">Shrub</option>
<option value="Tree">Tree</option>
<option value="Vine">Vine</option>
</select>
</div>
<div class="advanced">
<!--Select species origin-->
<label for="origin"><p class="advanced">Origin</p></label>
<select name="origin" id="origin">
<option value=""> -- All -- </option> <!-- Need to figure out how to pass an all option-->
<option value="Native">Native</option>
<option value="Exotic">Exotic</option>
</select>
</div>
</form>
</div>
{% endblock %}
{%extends“layout.html”%}
{%block content%}
高级搜索
生命形式
--全部--
禾本科
福布
亚灌木
灌木丛
树
藤蔓植物
原产地
--全部--
土生土长的
异国情调的
{%endblock%}
使用SQLAlchemy,您可以根据可用参数有条件地构建查询。基本上,您可以根据需要多次应用filter()
、filter\u by()
或任何其他查询方法,SQLAlchemy将了解如何构建查询
query = SPInfo.query
if stratum:
query = query.filter(SPInfo.Stratum == stratum)
if origin:
query = query.filter(SPInfo.Origin == origin)
if elev:
query = query.filter(SPInfo.Elevation.contains(elev))
results = query.all()
对于更干净的代码,您需要构建一个元素列表来测试如何应用这些过滤器,然后使用循环来执行上述操作。@PJ Santoro谢谢!我不得不玩它一点,但我只是做了一个快速测试,它看起来像是工作!太好了,很高兴我能帮忙!
query = SPInfo.query
if stratum:
query = query.filter(SPInfo.Stratum == stratum)
if origin:
query = query.filter(SPInfo.Origin == origin)
if elev:
query = query.filter(SPInfo.Elevation.contains(elev))
results = query.all()