【问题标题】:Flask Admin on postgres database viewpostgres 数据库视图上的 Flask Admin
【发布时间】:2023-03-15 20:48:01
【问题描述】:

有没有办法可以在数据库视图上的 Flask-Admin 上创建管理视图?我正在使用 Postgres,并且已经创建了一个视图,我们以下面的一个为例:

CREATE VIEW test_view AS (
    SELECT id, name, age, score
    FROM student
);

如果我想为此设置管理员视图,我该怎么做?

我尝试为它创建一个抽象模型:

class StudentView(sqa.Model):
    __abstract__ = True
    __tablename__ = 'test_view'

    id = sqa.Column(sqa.Integer)
    name = sqa.Column(sqa.String)
    age = sqa.Column(sqa.Integer)
    score = sqa.Column(sqa.Integer)

并添加了这样的管理视图:

from flask_admin.contrib.sqla import ModelView

class StudentViewAdmin(ModelView):
    _model = models.StudentView

向管理员注册此管理视图:

admin.add_view(admin_views.StudentViewAdmin(admin_views.DashboardView123._model, db.session))

但是,在将视图添加到管理员时出现以下错误:

Traceback (most recent call last):
  File "manage.py", line 8, in <module>
    setup_admin(app)
  File "/Users/rohitjain/app.py", line 35, in setup_admin
    admin.add_view(admin_views.StudentViewAdmin(admin_views.StudentViewAdmin._model, db.session))
  File "/Users/rohitjain/.venvs/venv/lib/python3.5/site-packages/flask_admin/contrib/sqla/view.py", line 318, in __init__
    menu_icon_value=menu_icon_value)
  File "/Users/rohitjain/.venvs/venv/lib/python3.5/site-packages/flask_admin/model/base.py", line 771, in __init__
    self._refresh_cache()
  File "/Users/rohitjain/.venvs/venv/lib/python3.5/site-packages/flask_admin/model/base.py", line 847, in _refresh_cache
    self._list_columns = self.get_list_columns()
  File "/Users/rohitjain/.venvs/venv/lib/python3.5/site-packages/flask_admin/model/base.py", line 979, in get_list_columns
    only_columns=self.column_list or self.scaffold_list_columns(),
  File "/Users/rohitjain/.venvs/venv/lib/python3.5/site-packages/flask_admin/contrib/sqla/view.py", line 404, in scaffold_list_columns
    for p in self._get_model_iterator():
  File "/Users/rohitjain/.venvs/venv/lib/python3.5/site-packages/flask_admin/contrib/sqla/view.py", line 340, in _get_model_iterator
    return model._sa_class_manager.mapper.iterate_properties
AttributeError: type object 'StudentView' has no attribute '_sa_class_manager'

我们真的可以这样做吗?我已经在 Django 中完成了这项工作,为 postgres 数据库视图设置了管理员,但直到现在我无法在 Flask 中设置相同的设置。有线索吗?

【问题讨论】:

    标签: python postgresql flask flask-admin


    【解决方案1】:

    我认为,如果您要发布定义模型的文件的其余部分,这会有所帮助。您可能扩展了错误的类(sqa.Model)。

    您的ModelView 也没有列出任何列。我认为这可能是必需的?

    Here'sflask_admin 的 hello_world 文档。您可以看到他们在 ModelView 中明确指定了列、过滤器和可搜索性。

    摘录:

    class User(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(64), unique=True)
        email = db.Column(db.String(128))
    
    class UserView(ModelView):
        # Show only name and email columns in list view
        column_list = ('name', 'email')
    
        # Enable search functionality - it will search for terms in
        # name and email fields
        column_searchable_list = ('name', 'email')
    
        # Add filters for name and email columns
        column_filters = ('name', 'email')
    

    【讨论】:

    • 再次澄清我的问题,我想在数据库视图而不是表上创建 ModelView。您正在普通桌子上创建。
    • 顺便说一句,在 postgres 中,数据库视图不能有主键。
    【解决方案2】:

    是否有理由创建抽象模型? __abstract__ 属性设置为 True 是导致此错误的原因。如果你不从这个模型子类化你就不需要它:

    class StudentView(sqa.Model):
        __tablename__ = 'test_view'
    
        id = sqa.Column(sqa.Integer, primary_key=True)
        name = sqa.Column(sqa.String)
        age = sqa.Column(sqa.Integer)
        score = sqa.Column(sqa.Integer)
    

    SQLAlchemy 映射器也需要一个主键(在模型中而不是在实际视图中)。应用程序会将您的视图视为一个表,因此它不会在不尝试更新视图时立即产生数据库错误。

    【讨论】:

    • 啊!知道了。刚刚将我的一个列作为模型本身的主键,它就起作用了。我认为它不需要成为视图本身的主键。
    • 非常感谢。启动并运行仪表板。看来前面的答案也是正确的。
    【解决方案3】:

    可以使用 Python 中的 sandman 库来实现管理视图。这是sandman

    的链接

    这是使用 flask-admin 的代码。但首先您必须通过命令安装库
    pip install sandman

    from sandman2 import app
    
    app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:root@localhost/testsmsmagic'
    #path of your database.
    
    from sandman2.model import activate
    
    activate()
    
    app.run(port=5999)
    

    运行该文件后,您可以在浏览器上使用http://localhost:5999/admin 看到您的管理门户

    【讨论】:

      猜你喜欢
      • 2021-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多