Flask-Admin 具有多对多关系中的附加字段
Flask-Admin with additional field in relationship Many to Many
我有两个 table:"Product"、"Ingredient" 和 "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 中有一个 amount 字段,它将获取构成每个产品的每种成分的数量
在admin中设置字段,出现以下错误
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
异常:表单列位于另一个 table 中并且需要 inline_models:Ingrediente.desc
我研究了很多关于 inline_models 但没有找到解决这个问题的方法
问题是 Product
对象可以有多种成分,并且不能在一个表单字段中指定它们。所以 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]
这会创建一个字段,允许像标签一样向其中添加项目。
我有两个 table:"Product"、"Ingredient" 和 "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 中有一个 amount 字段,它将获取构成每个产品的每种成分的数量
在admin中设置字段,出现以下错误
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
异常:表单列位于另一个 table 中并且需要 inline_models:Ingrediente.desc
我研究了很多关于 inline_models 但没有找到解决这个问题的方法
问题是 Product
对象可以有多种成分,并且不能在一个表单字段中指定它们。所以 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]
这会创建一个字段,允许像标签一样向其中添加项目。