2017-03-10 55 views
1

有沒有辦法在數據庫視圖上在Flask-Admin上創建管理視圖?我使用的是Postgres,並創建了一個觀點,讓我們下面的一個爲例:在postgres數據庫視圖上的Flask管理

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中設置相同的值。任何線索?

回答

1

是否有必要創建一個抽象的模型? __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的映射需要一個主鍵(在模型中未實際視圖)。該應用程序會將您的視圖視爲一張表,因此只要不嘗試更新視圖,它就不會產生數據庫錯誤。

+1

啊!得到它了。剛剛讓我的一個專欄成爲模型本身的主鍵,而且工作起來。我認爲它不需要成爲視圖本身的主鍵。 –

+0

@RohitJain哦,在答案中澄清它,謝謝! –

+0

非常感謝。儀表板啓動並運行。看起來以前的答案也是正確的。 –

1

我認爲這將有助於您發佈定義模型的文件的其餘部分。你可能會延伸錯誤的類(sqa.Model)。您的ModelView也沒有列出列。我認爲這可能是必需的?

Here's用於flask_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') 
+0

只是爲了澄清我的問題再次,我想在數據庫視圖上創建ModelView,而不是表格。你在普通桌子上創建。 –

+0

順便說一下,在postgres中,數據庫視圖不能有主鍵。 –

0

管理視圖可以與睡魔庫的Python。這裏實現的是鏈接進行sandman

下面是一個使用瓶管理員的代碼。但首先你必須通過命令來安裝庫
PIP安裝桑德曼

from sandman2 import app 

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:[email protected]/testsmsmagic' 
#path of your database. 

from sandman2.model import activate 

activate() 

app.run(port=5999) 

運行後文件中,您可以看到瀏覽器的管理門戶,http://localhost:5999/admin