Как передать переменную как имя столбца в sqlalchemy? [Дубликат]

0

Недавно я создал скрипт, который позволяет пользователю как фильтровать таблицу, так и сортировать оставшиеся столбцы в порядке возрастания и убывания. Вот что я написал:

    if 'desc' in request.form:
        if request.form['desc'] == 'date_time':
            display_test_results = test_result.query.order_by(desc(test_result.date_time)).filter(or_(test_result.date_time.like('%' +global_value_detailed+ '%'),                                                          
                                                    test_result.place_of_test.like('%' +global_value_detailed+ '%'),
                                                    test_result.part_number.like('%' +global_value_detailed+ '%'),
                                                    test_result.serial_number.like('%' +global_value_detailed+ '%'),
                                                    test_result.test_details.like('%' +global_value_detailed+ '%'),
                                                    test_result.result.like('%' +global_value_detailed+ '%')))

            return render_template('/detailed_test_data.html', title='Database Full', display_test_results=display_test_results)

        elif request.form['desc'] == 'part_number':

Затем повторить это для всех моих столбцов, проблема здесь в том, что у меня есть 17 столбцов (не все они были использованы в этом примере.) Таким образом, чтобы получить работу по восходящей и нисходящей сортировке, у меня есть 34 пакета кода, составляющих 900 строк. Это огромный объем кода, который замедлит производительность моей функции поиска/сортировки (я полагаю).

Есть ли способ использования уточненного кода, где значение request.form ['desc'] сохраняется как переменная, а затем эта переменная используется для указания запроса, в каком столбце следует посмотреть? Я предполагаю, что в конечном итоге он будет выглядеть примерно так же, как в приведенном ниже коде. Но когда я запускаю этот код, я получаю сообщение об ошибке.

 if request.form['desc'] != '':
                    order_column = request.form['desc']

                    display_test_results = test_result.query.order_by(desc(test_result.order_column)).filter(or_(test_result.date_time.like('%' +global_value_primary+ '%'),
                                                                                                            test_result.place_of_test.like('%' +global_value_primary+ '%'),
                                                                                                            test_result.serial_number.like('%' +global_value_primary+ '%'),
                                                                                                            test_result.result.like('%' +global_value_primary+ '%'))).filter(test_result.test_details=='Overall').all()
                    return render_template('/primary_test_data.html', title='', display_test_results=display_test_results)

 elif request.form['asc'] != '':
                    order_column = request.form['asc'] ... 

AttributeError: тип объекта 'test_result' не имеет атрибута 'order_column'

Теги:
flask
sqlalchemy

1 ответ

1
Лучший ответ

Использовать getattr

.order_by(desc(getattr(test_result, request.form['desc'])))

Ещё вопросы

Сообщество Overcoder
Наверх
Меню