Невозможно использовать query.filter_by в Flask -SQLAlchemy с ключевыми аргументами или переменными - PullRequest
0 голосов
/ 17 июня 2020

Я работаю над приложением для блога в Flask и изо всех сил пытаюсь найти способ обернуть некоторый код, который будет фильтровать сообщения блога по категориальным атрибутам (или тегам), которые пользователи будут добавлять в свои сообщения. Например, приведенный ниже код предназначен для возврата всех сообщений, отмеченных как «анонимные».

@app.route('/search', methods=['GET', 'POST'])
def search():
    form = SearchForm()
    if form.validate_on_submit():
        anonymous = form.anonymous.data
        flash('Here are your search results!')
        return redirect(url_for('search_results', anonymous=anonymous))
    return render_template('search.html', title='Search', form=form)

@app.route('/search_results/', methods=['GET', 'POST'])
def search_results():
    page = request.args.get('page', 1, type=int)
    anonymous = request.args.get('anonymous')
    posts = Post.query.filter_by(anonymous=anonymous).paginate(page, app.config['POSTS_PER_PAGE'],                                    False).items
    return render_template('search_results.html', title='Search Results', posts=posts)

Как видно из приведенного выше кода, я хотел бы иметь возможность использовать request.args.get('anonymous'), чтобы узнать, ищет ли пользователь анонимные сообщения, а затем использовать Post.query.filter_by(anonymous=anonymous), чтобы найти все сообщения, соответствующие этому описанию. . Это работает без проблем, когда я использую Post.query.filter_by(anonymous=True), как вы можете видеть ниже.

print(Post.query.filter_by(anonymous=True))
posts = Post.query.filter_by(anonymous=True).paginate(page, app.config['POSTS_PER_PAGE'], False).items
print(posts)

SELECT post.id AS post_id, post.body AS post_body, post.image_name AS post_image_name, post.image AS post_image, post.anonymous AS post_anonymous, post.timestamp AS post_timestamp, post.user_id AS post_user_id
FROM post
WHERE post.anonymous = 1
[<Post my first post!>, <Post new post!>]

Однако, когда я передаю переменную в query.filter_by, похоже, что она не вставляет значение в параметр. Результатом запроса является пустой набор, даже если значение «анонимный» определенно установлено на True.

anonymous = request.args.get('anonymous')
print(anonymous)
print(Post.query.filter_by(anonymous=anonymous))
posts = Post.query.filter_by(anonymous=anonymous).paginate(page, app.config['POSTS_PER_PAGE'], False).items
print(posts)

True
SELECT post.id AS post_id, post.body AS post_body, post.image_name AS post_image_name, post.image AS post_image, post.anonymous AS post_anonymous, post.timestamp AS post_timestamp, post.user_id AS post_user_id
FROM post
WHERE post.anonymous = ?
[]

В запросе я получаю условие WHERE post.anonymous = ? вместо WHERE post.anonymous = 1 (or 0), которое я надеялся увидеть. Ниже приведен код, который я пробовал:

Я предполагаю, что SQL -Alchemy просто не поддерживает использование переменной в качестве заполнителя для значения, которое я хочу запросить. В противном случае может быть какой-то синтаксис, о котором я не знаю, который мне нужно использовать для выполнения этой работы, что я и изучаю в данный момент. Любое руководство будет очень признательно.

1 Ответ

0 голосов
/ 18 июня 2020

Как обсуждалось в комментариях выше, проблема заключалась в том, что значение в анонимном было преобразовано из логического в строку, когда оно было передано из маршрута поиска в маршрут search_results. Я использовал быстрый оператор if-else, чтобы преобразовать значение обратно в логическое, и теперь все работает так, как ожидалось.

@app.route('/search', methods=['GET', 'POST'])
def search():
    form = SearchForm()
    if form.validate_on_submit():
        anonymous = form.anonymous.data
        print(anonymous)
        print(type(anonymous))
        flash('Here are your search results!')
        return redirect(url_for('search_results', anonymous=anonymous))
    return render_template('search.html', title='Search', form=form)

127.0.0.1 - - [18/Jun/2020 01:56:16] "GET /search HTTP/1.1" 200 -
True
<class 'bool'>

@app.route('/search_results/', methods=['GET', 'POST'])
def search_results():
    page = request.args.get('page', 1, type=int)
    anonymous = request.args.get('anonymous')
    print(anonymous)
    print(type(anonymous))
    if anonymous == 'True':
        anonymous = bool(1)
    else:
        anonymous = bool(0)
    print(anonymous)
    print(type(anonymous))
    posts = Post.query.filter_by(anonymous=anonymous).paginate(page, app.config['POSTS_PER_PAGE'], False).items
    print(posts)
    return render_template('search_results.html', title='Search Results', posts=posts)

127.0.0.1 - - [18/Jun/2020 01:56:30] "POST /search HTTP/1.1" 302 -
True
<class 'str'>
1
<class 'bool'>
[<Post my first post!>, <Post new post!>]

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