其他分享
首页 > 其他分享> > 与多对多关系中的其他字段的Flask-Admin

与多对多关系中的其他字段的Flask-Admin

作者:互联网

我有两个表:“产品”,“成分”和“ ProductIngredient”

class ProductIngredient(db.Model):
    __tablename__ = "product_ingredient"
    id = db.Column(db.Integer(), primary_key=True)
    product_id = db.Column('product_id', db.Integer, db.ForeignKey('product.id'))
    ingredient_id = db.Column('ingredient_id', db.Integer, db.ForeignKey('ingredient.id'))
    amount = db.Column(db.DECIMAL(10, 3))


class Ingredient(db.Model):
    __tablename__ = "ingredient"

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))
    desc = db.Column(db.Text)


class Produto(db.Model):
    __tablename__ = "product"

    id = db.Column(db.Integer, primary_key=True)
    desc = db.Column(db.String(20))
    ingredients = db.relationship('Ingredient', secondary='product_ingredient', backref=db.backref('product', lazy='dynamic'))

请注意,在ProductIngredient类中有一个数量字段,该字段将提取构成每种产品的每种成分的数量

在管理员中设置字段,出现以下错误

class ProdMV(ModelView):
    column_display_pk = False
    form_columns = [Product.desc, Ingredient.name, ProductIngredient.amount]
    column_auto_select_related = True
    column_hide_backrefs = False


admin.add_view(ProdMV(Product, db.session))

Builtins.Exception

例外:表单列位于另一个表中,并且需要inline_models:Ingrediente.desc

我对inline_models进行了很多研究,但没有找到解决该问题的方法

解决方法:

问题在于产品对象可以具有多种成分,并且不能在一个表单字段中指定它们.因此flask_admin提示您应该使用inline_models.您需要向ProductIngredient模型添加关系:

class ProductIngredient(db.Model):
    __tablename__ = 'product_ingredient'

    id = db.Column(db.Integer, primary_key=True)
    product_id = db.Column(db.Integer, db.ForeignKey('product.id'))
    ingredient_id = db.Column(db.Integer, db.ForeignKey('ingredient.id'))
    amount = db.Column(db.DECIMAL(10, 3))

    product = db.relationship('Product', backref='products')
    ingredient = db.relationship('Ingredient', backref='ingredients')

而且您的ProductMV将如下所示:

class ProductMV(ModelView):
    form_columns = ('desc',)
    inline_models = ((
        ProductIngredient,
        {
            'form_columns': ('id', 'amount', 'ingredient'),
        }
    ),)

如果您没有ProductIngredient.amount字段,则可以键入:

form_columns = [Product.desc, Product.ingredients]

这将创建一个字段,该字段允许向其添加标签等项目.

标签:python-3-x,flask,flask-sqlalchemy,flask-admin,python
来源: https://codeday.me/bug/20191108/2008508.html