flask-admin根据需要标记db.relationship的model views个字段,因此如果关系所在的表为空,则无法添加记录。
示例:
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创建区域记录时需要类型字段,但如果类型表为空,则无法将任何信息添加到数据库。 flask-admin不允许向Area表添加任何内容,因为backref到Type表,这使得字段成为必需,但Type表中还没有任何内容。 flask-admin也不允许向Area表添加任何内容,因为页面上需要字段 types 。
我在这个问题上找不到任何东西。有一些主题讨论多对多关系的解决方法,但这是最简单的一对多关系,据我所知,这应该只是开箱即用。
我发现如果我在区域模型下添加Type到inline_models,那么我会在create Area页面上看到一个按钮“Add Types”,但是如果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 :(得分:0)
事实证明,如果与该关系相关联的外键具有 nullable = False ,那么 flask-admin 会根据 flask-wtf <中的要求标记该字段/ strong>即可。从类型类的外键属性中删除 nullable = False 后, flask-admin 停止在两个Type模型中按要求显示该字段视图和区域模型视图。
然而,当我删除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')
答案 1 :(得分:0)
此问题已在git master中修复。 Flask-Admin 1.0.7已经有几个月了,从那时起git版本已经积累了不少变化。
谢尔盖从外键中删除nullable=False
的答案改变了语义,因此是一种解决方法。使用主人的Flask-Admin,nullable=False
可以保留。