Как получить запрос в sqlalchemyORM также - PullRequest
0 голосов
/ 10 ноября 2019

У меня есть несколько полей формы на странице поиска. После выполнения поиска на моей странице должен отобразиться список возможных результатов поиска. Если пользователь ввел только часть названия, номера ISBN или имени автора, страница поиска также должна найти совпадения для них. Также, если пользователь набрал только одно или несколько полей - страница должна показать все совпадения.

Idk, как написать запрос. Если у меня есть одно значение из request.form, а другие значения 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)

1 Ответ

0 голосов
/ 11 ноября 2019

.filter_by (несколько аргументов) по умолчанию будет иметь значение И, что означает, что пользователю придется вводить данные, соответствующие всем полям

Это также означает, что если пользователь оставляет поля пустыми,query будет возвращать только те книги, которые имеют (например) title = "" (когда форма заголовка пуста), несмотря на то, что введен правильный год.

Это, вероятно, не предназначено, с точки зрения пользователя. Способ исправить это состоит в том, чтобы (1. проверить входные данные, а затем) добавить фильтры в список, если они не пусты, а затем добавить непустые поля с помощью или _ (* filter_list). Затем Query вернет все строки, которые соответствуют любому полю, указанному в формах.

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_list позволяет передавать список методу фильтра, или_ позволяет изменить значение по умолчанию AND наИЛИ

подробнее здесь: Использование ИЛИ в SQLAlchemy

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...