2

Я пытаюсь создать запрос, который принимает данные формы и удаляет любые сообщения None или " ", но я не уверен, как подойти к логике. Вот код;Удалить объекты из запроса, если None или Null

@app.route('/filterassets', methods=['GET', 'POST']) 
def searchassets(): 
form = FilterAssetsForm() 
results = None 
if request.method == "POST": 
    if form.validate_on_submit(): 
     try: 
      horsepower = form.horsepower_search.data 
      voltage = form.voltage_search.data 
      rpm = form.rpm_search.data 
      results = Motor.query.filter_by(horsepower=horsepower, voltage=voltage, rpm=rpm).all() 
     except Exception as e: 
      flash(e) 
      db.session.rollback() 
     return render_template('filterassets.html', form=form, results=results) 
return render_template('filterassets.html', form=form) 

Потому что это бэкэнд страницы, которая позволяет пользователям фильтровать, а не явно искать, некоторые данные формы пустые. Это вызывает запрос для поиска результатов, где одна или несколько форм == Нет.

Пример: пользователь вводит 100 в форме лошадиной силы и оставляет затухание оборотов и напряжение. Запрос не возвращает никаких результатов, хотя есть строки с мощностью 100 лошадиных сил, потому что он ищет строки, где Horsepower == 100 и RPM и Voltage == None.

Я пробовал использовать filter(None, object) без каких-либо успехов и думаю, что решение может быть где-то в использовании kwargs.

Я знаю, что мне нужно передать все данные формы, чтобы удалить None или Null записей, а затем передать их в окончательный аргумент Motor.query.filter_by, я просто не знаю, как это сделать.

ответ

2

Вы можете создать dict с данными фильтра:

filter_data = {'horsepower': horsepower, 'voltage': voltage, 'rpm': rpm} 

Затем создайте еще один dict только с ключами, которые существуют значения:

filter_data = {key: value for (key, value) in filter_data.items() 
       if value} 

И, наконец, использовать эту Dict как kwargs к вашему запросу :

results = Motor.query.filter_by(**filter_data).all() 
+0

Спасибо! Это действительно помогло мне разобраться. Мне просто трудно понять, как аргументы filter_by() могут понять kwarg и интерпретировать его в правильном формате, даже если это dict? Является ли это особенностью SQLAlchemy, способной переводить словарь в модели и наоборот? – xGlorify

+1

Нет, это на самом деле функция Python для передачи параметров функции. Узнайте больше: http://pythontips.com/2013/08/04/args-and-kwargs-in-python-explained/ –