SQLAlchemy фильтр на основе логики - PullRequest
0 голосов
/ 02 марта 2020

У меня есть приложение flask, которое использует SQLAlchemy. Для одной из конечных точек '/items' я хочу вернуть список элементов.

Это просто ItemModel.query.all(), где ItemModel - это класс, представляющий элементы.

Но, скажем, я хочу разрешить параметры строки запроса URL, например, '/items?type=book'

Если бы я жестко закодировал, это было бы просто с TopicModel.query.filter_by(type=book).all()

С кратным это могло бы быть TopicModel.query.filter_by(type=book).filter_by(colour=yellow).all()

Но как я мог эффективно сгенерировать этот запрос, чтобы он фильтровал только по параметру, если пользователь указывает этот параметр в строке запроса?

Должно ли что-то подобное работать? Если это так, будет ли он выполнять несколько запросов к базе данных (и, следовательно, будет медленным и ресурсоемким)?

def get(self):
    type = request.args.get('type')
    color = request.args.get('color')
    size = request.args.get('size')

    query = ItemModel.query

    if type:
        query = query.filter_by(type=type)
    if color:
        query = query.filter_by(color=color)
    if size:
        query = query.filter_by(size=size)
    return {'items' : query.all() }

Ответы [ 2 ]

0 голосов
/ 02 марта 2020

Пожалуйста, проверьте это. Не следует извлекать все, пока вы не примените все условия к запросу.

def get(self):
    type = request.args.get('type')
    color = request.args.get('color')
    size = request.args.get('size')

    query_obj = ItemModel.query

    if type:
        query_obj = query_obj.filter_by(type=type)
    if color:
        query_obj = query_obj.filter_by(color=color)
    if size:
        query_obj = query_obj.filter_by(size=size)
    return {'items' : query_obj.all() }
0 голосов
/ 02 марта 2020

Вот ваш восстановленный код.

def get(self):
    type = request.args.get('type')
    color = request.args.get('color')
    size = request.args.get('size')

    query = ItemModel.query.all()

    if type:
        query = query.filter_by(type=type).all()
    if color:
        query = query.filter_by(color=color).all()
    if size:
        query = query.filter_by(size=size).all()
    return {'items' : query }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...