1

flask-admin根据需要标记模型视图的db.relationship字段,因此如果关系所在的表为空,则无法添加记录。

例子:

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')

通过flask-admin创建区域记录时需要types字段,但是如果type表为空,则无法向数据库添加任何信息。flask-admin 不允许向 Area 表添加任何内容,因为对 Type 表的backref使得该字段成为必填字段,但 Type 表中还没有任何内容。flask-admin 也不允许向 Area 表添加任何内容,因为页面上需要字段类型

我找不到关于这个主题的任何东西。有一些主题讨论了多对多关系的解决方法,但这是最简单的一对多关系,据我所知,它应该开箱即用。

我发现如果我在 Area 模型下将 Type 添加到 inline_models ,那么我会在创建 Area 页面上看到一个“添加类型”按钮,但是如果 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'))
4

2 回答 2

1

事实证明,如果与关系关联的外键具有nullable=Falseflask-admin将该字段标记为flask-wtf 中的要求。一旦我从Type类的外键属性中删除了nullable=False , flask-admin 就会停止在 Type 模型视图和 Area 模型视图中显示所需的字段。

但是,当我删除 nullable=False 时,没有更多的理由 ondelete="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')
于 2014-02-21T06:45:50.183 回答
0

此问题已在 git master 中修复。Flask-Admin 1.0.7 已经有几个月的历史了,从那时起 git 版本已经积累了很多变化。

Sergeynullable=False从外键中删除的答案改变了语义,因此是一种解决方法。使用 master 的 Flask-Admin,nullable=False可以保留。

于 2014-04-02T14:18:27.500 回答