2014-02-20 55 views
1

flask-admin標記db.relationship根據需要model views字段,因此如果關係所屬的表爲空,則無法添加記錄。flask-admin在關係上施加必需的屬性

實施例:

class Type(db.Model): 
    id   = db.Column(db.Integer, primary_key=True) 
    name   = db.Column(db.String(50), nullable=False, unique=True, index=True) 
    area_id  = db.Column(db.Integer, db.ForeignKey("area.id", onupdate='CASCADE', ondelete='CASCADE'), nullable=False, index=True) 
    description = db.Column(db.Text) 

class Area(db.Model): 
    id   = db.Column(db.Integer, primary_key=True) 
    name   = db.Column(db.String(50), nullable=False, unique=True, index=True) 
    description = db.Column(db.Text) 
    types = db.relationship('Type', backref='Area', lazy='dynamic', cascade='all, delete-orphan') 
通過燒瓶管理員創建的 面積記錄期間

類型字段是必需的,但如果類型表是空的,沒有辦法任何信息添加到數據庫。由於backref到類型表,使得該字段是必需的,但是沒有類型表中的任何內容,flask-admin不允許向Area表中添加任何內容。 flask-admin也不允許向Area表添加任何內容,因爲頁面上需要類型

我在主題上找不到任何東西。有一些話題討論了多對多關係的解決方法,但這是最簡單的一對多關係,根據我的理解,這些關係應該是開箱即用的。

我想通了,如果我添加類型下面積模型inline_models話,我會看到一個按鈕「添加類型」上創建區域頁,但如果inline_model本身有關係,那將沒有幫助,因爲任,同樣的原因。

class ModelViewArea(ModelView): 
    inline_models = (models.Type,) 

admin.add_view(ModelViewProductArea (models.Area, db.session, name="Area", category='Product')) 
admin.add_view(ModelViewProductType (models.Type, db.session, name="Type", category='Product')) 

回答

0

原來,如果有關聯關係的外鍵具有可空=假然後燒瓶管理員燒瓶跆拳道要求,標誌着該領域。一旦我從類型類刪除可空=假 flask-admin停止在類型模型視圖和區域模型視圖中顯示所需字段。

但是,當我刪除nullable = False時,ondelete =「CASCADE」和關係級聯行爲沒有更多的理由。 Default cascade比較適合。最終的代碼如下所示:

class Type(db.Model): 
    id   = db.Column(db.Integer, primary_key=True) 
    name   = db.Column(db.String(50), nullable=False, unique=True, index=True) 
    area_id  = db.Column(db.Integer, db.ForeignKey("area.id", onupdate='CASCADE', ondelete='SET NULL'), index=True) 
    description = db.Column(db.Text) 

class Area(db.Model): 
    id   = db.Column(db.Integer, primary_key=True) 
    name   = db.Column(db.String(50), nullable=False, unique=True, index=True) 
    description = db.Column(db.Text) 
    types = db.relationship('Type', backref='Area', lazy='dynamic') 
0

此問題已在git master中修復。 Flask-Admin 1.0.7已經幾個月了,從那時起,git版本已經積累了不少變化。

謝爾蓋從外鍵中刪除nullable=False的回答改變了語義,因此是一種解決方法。有了主人的Flask-Admin,可以留下nullable=False