flask-admin对关系强制要求属性

时间:2014-02-20 06:39:08

标签: python sqlalchemy flask flask-sqlalchemy flask-admin

flask-admin根据需要标记db.relationshipmodel 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'))

2 个答案:

答案 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可以保留。