如何在flask中执行这个复杂的搜索查询?

如何在flask中执行这个复杂的搜索查询?,flask,flask-wtforms,Flask,Flask Wtforms,我正在尝试实现一个“高级搜索”,但为了这个问题,我会让它简单一点 迄今为止的工作方式: @app.route('/advanced_search', methods=['GET', 'POST']) def advanced_search(): form = AdvancedProductSearch() # this is a SelectMultipleField countries = ['Canada', 'France', 'Mexico', 'Nigeria']

我正在尝试实现一个“高级搜索”,但为了这个问题,我会让它简单一点

迄今为止的工作方式:

@app.route('/advanced_search', methods=['GET', 'POST'])
def advanced_search():
    form = AdvancedProductSearch()   # this is a SelectMultipleField
    countries = ['Canada', 'France', 'Mexico', 'Nigeria']
    form.categories.choices = [(c,c) for c in countries]
    if form.validate_on_submit():
        countrydata = form.countries.data
        res = models.Product.query.filter(models.Product.country.in_(countrydata)).all()
        # Now I have my search results, what do I do with them?
    return render_template('advanced_search.html', title='Advanced Search', form=form)
我的计划是必须有另一个视图:
advanced\u search\u results
,它应该用于呈现结果,但我不知道它应该如何工作

@app.route('/advanced_search_results', methods=['GET', 'POST'])
def advanced_search_results(query):
    #what to do?
    return render_template('advanced_search_results.html', title='Search Results')
我可以想出两种方法:

1) 以某种方式将res中的所有数据行传递到
advanced\u search\u results()
视图,但我不知道如何才能做到这一点


2) 使用重定向将所需的搜索查询传递到
高级搜索结果()
,然后在那里执行db搜索。我也不知道该怎么做。

只需返回必要的视图:

res = models.Product.query.filter(models.Product.country.in_(countrydata)).all()
# Now I have my search results, let's send them back
return render_template('advanced_search_results.html', title='Results',
                       results=res)
然后,在视图中,可以像对任何其他模型列表一样循环结果:

{% for result in results %}
  {{ result.name }}<br>
  {{ result.country }}<br>
  <hr noshade>
{% endfor %}
然后,您可以验证搜索,并显示结果或使用错误消息重定向用户:

@app.route('/advanced_search_results', methods=['POST'])
def advanced_search_results():
    form = AdvancedProductSearch()
    countries = ['Canada', 'France', 'Mexico', 'Nigeria']
    form.categories.choices = [(c,c) for c in countries]
    if not form.validate_on_submit():
        flash("There were errors with your submission")
        return redirect(url_for('advanced_search'))

    countrydata = form.countries.data
    res = models.Product.query.filter(models.Product.country.in_(countrydata)).all()
    return render_template('advanced_search_results.html',
                           title='Search Results',
                           results=res)
这使您的
高级搜索方法更加简单:

@app.route('/advanced_search', methods=['GET'])
def advanced_search():
    form = AdvancedProductSearch()   # this is a SelectMultipleField
    countries = ['Canada', 'France', 'Mexico', 'Nigeria']
    form.categories.choices = [(c,c) for c in countries]
    return render_template('advanced_search.html', title='Advanced Search', form=form)

啊,我忘了我可以从这个视图中
渲染_template()
。我唯一的问题是,用户仍然在。这能改变吗?啊,这看起来好多了。但是我们是否必须在两个视图中填写
表单.类别的
选项
?表单似乎无法验证,否则。。。我们能绕开这件事吗?我的
选择
将来自一些数据库查询,但它们在
高级搜索结果()视图中是多余的。如果要验证请求,则需要将选择拉到验证内容的位置。您可以添加缓存以避免额外的数据库跳闸。如何添加缓存?如果不是表单,我可以用
替换
。如果不是表单,我可以用
替换
。\u submit():
,它可以工作,但我不确定这是否是个好主意。不,缓存将处于查找级别,因此获取表单选项将在第一个请求时填充缓存,所有后续请求将从Python进程本地数据结构中提取表单选项。这是一个完全不同的问题:——)
@app.route('/advanced_search', methods=['GET'])
def advanced_search():
    form = AdvancedProductSearch()   # this is a SelectMultipleField
    countries = ['Canada', 'France', 'Mexico', 'Nigeria']
    form.categories.choices = [(c,c) for c in countries]
    return render_template('advanced_search.html', title='Advanced Search', form=form)