Я использую фабрику приложений для добавления представлений в мое приложение для колб, например, так:
(это не моя фактическая фабрика приложений, и она была сокращена для краткости)
def create_app(config_name='default'):
app = Flask(__name__, template_folder="templates", static_folder='static')
admin_instance = Admin(app, name='Admin')
admin_instance.add_view(EntityAdmin(Entity, db.session))
Мой класс EntityAdmin выглядит следующим образом:
class EntityAdmin(ModelView):
column_filters = [
MyCustomFilter(column=None, name='Custom')
]
Мой пользовательский фильтр выглядит следующим образом:
class MyCustomFilter(BaseSQLAFilter):
def get_options(self, view):
entities = Entity.query.filter(Entity.active == True).all()
return [(entity.id, entity.name) for entity in entities]
Проблема в том, что кажется, что функция get_options
вызывается, когдаприложение создается, выполняя запрос select каждый раз, когда вызывается функция create_app
.
Поэтому, если я обновляю схему своей базы данных и запускаю команду flask db migrate
, я получаю сообщение об ошибке, поскольку добавленный мной новый столбец не существует, когда выполняется запрос на выборку.Запрос вызывает ошибку, потому что моя схема базы данных не синхронизирована с фактической базой данных.
Могу ли я зарегистрировать свои представления только после выполнения фактического HTTP-запроса?Как я могу различить запрос и команду?