如何在sqlalchemyORM中获取查询

2024-03-28 12:57:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我在搜索页面上几乎没有表单字段。执行搜索后,我的页面将显示可能匹配结果的列表。如果用户只输入了标题、ISBN或作者姓名的一部分,搜索页面也应该找到这些内容的匹配项。此外,如果用户只键入一个或几个字段-页面应显示所有匹配项。你知道吗

Idk如何写查询。如果我有一个申请表其他值为None,所以整个查询为空

@app.route('/search', methods=("GET", "POST"))
def search_book():
    books = None
    if request.method == "POST":
        isbn = request.form['isbn']
        title = request.form['title']
        author = request.form['author']
        year = request.form['year']
        books = db.query(Books).filter_by(isbn=isbn, title=title, author=author, year=year).all()
    return render_template("search.html", books=books)

Tags: 用户formnone标题列表searchtitlerequest
1条回答
网友
1楼 · 发布于 2024-03-28 12:57:36

.filter_by(多个参数)将默认为AND,这意味着用户必须输入与所有字段匹配的数据

这也意味着,如果用户将字段留空,查询将只返回具有(例如)title=“”(当title form为空时)的书籍,尽管输入了有效的年份。你知道吗

从用户的角度来看,这可能不是有意的。解决这个问题的方法是(1。验证输入数据,然后)如果筛选器不是空的,则将其添加到列表中,然后使用或(*filter\u list)添加非空字段。然后,查询将返回与表单指定的任何字段匹配的所有行。你知道吗

from sqlalchemy import or_
query = db.query(Books)
filter_list = []
if request.form['isbn']:
    filter_list.append(Book.isbn.ilike(request.form['isbn']))
if request.form['author']:
    filter_list.append(Book.author.ilike(request.form['author']))
# etc...

if len(filter_list) > 0:
    query = query.filter(or_(*filter_list))

没有测试代码,但是*filter\u list允许您将一个列表传递给filter方法,或者\u允许您更改默认值和或

更多信息: Using OR in SQLAlchemy

相关问题 更多 >