如何在烧瓶中进行这个复杂的搜索查询?

How to do this complex search query in flask?

我正在尝试实现一个 'advanced search',但为了这个问题,我会使其更简单一些。

目前的运作方式:

@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_search_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_search_results() 视图,但我不知道该怎么做。

2) 使用重定向将所需的搜索查询传递给 advanced_search_results() 并在那里进行数据库搜索。我也不知道该怎么做。

简单return必要的观点:

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

或者,如果您想将其托管在另一个 URL,只需将 advanced-search 页面上表单的 action 更改为指向 advanced-search-results

<form action="/advanced_search_results" method="post">
    {# etc ... #}
</form>

然后您可以验证搜索并显示结果或使用错误消息重定向用户:

@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)

这使您的 advanced_search 方法更简单:

@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)