Flask 烧瓶-SQLAlchemy-使用过滤器进行高级搜索

Flask 烧瓶-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

我正在使用一系列过滤器和html选择下拉列表来尝试创建高级搜索。我希望用户能够选择各种领域,他们希望搜索和获得结果。如果我在下面的views.py中只有4个字段是“query”的活动字段,但超过4个字段没有返回结果,因为没有任何记录满足所有过滤器字段值,那么我可以让“search”(即复杂过滤器)工作。我知道会发生的

因此,我一直在试图找出如何创建一个“-All--”选项,以便用户可以选择他们最感兴趣的属性,以及他们希望“查询”忽略的属性

views.py(截断版本有多个字段可供搜索)

search_advanced.html

{% 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()