【问题标题】:Flask- SQLAlchemy- Advanced Search using FilterFlask- SQLAlchemy- 使用过滤器的高级搜索
【发布时间】:2017-01-13 04:41:57
【问题描述】:

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

所以我一直在试图弄清楚如何创建一个“--All--”选项,以便用户可以选择他们最感兴趣的属性,以及他们希望“查询”忽略哪些属性。

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

from flask import render_template, redirect, session, url_for, request, send_from_directory
from sqlalchemy import or_, and_, select
from flask.ext.security import login_required
from datetime import datetime
from RestorationPlantDB import app, db
from RestorationPlantDB import SPECIES, SPInfo, SPRef, Role, User

@app.route('/search_advanced', methods = ['GET', 'POST'])
def search_advanced():
    if request.method == 'POST':
        stratum = request.form.get('stratum')
        origin = request.form.get('origin')


        query = SPInfo.query.filter(and_(SPInfo.Stratum == stratum, 
                                         SPInfo.Origin == origin))

    return render_template('result_advancedsearch.html', year=datetime.now().year, query=query)

return render_template('search_advanced.html', year=datetime.now().year)

@app.route('/result_advancedsearch', methods = ['GET', 'POST'])
def result_advancedsearch():

    return render_template('result_advancedsearch.html', year=datetime.now().year)

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 %}

【问题讨论】:

    标签: flask html-select flask-sqlalchemy flask-wtforms


    【解决方案1】:

    使用 SQLAlchemy,您可以根据可用参数有条件地构建查询。本质上,您可以根据需要多次应用filter()filter_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 谢谢!我必须玩一下,但我只是做了一个快速测试,看起来它正在工作!
    • 太好了,很高兴我能帮上忙!
    猜你喜欢
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2015-04-13
    • 1970-01-01
    • 2015-05-20
    • 2017-02-18
    相关资源
    最近更新 更多