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