flask-admin + sqlalchemy - 在父模型视图中修改 "sets" 相关记录
flask-admin + sqlalchemy - modify "sets" of related records in parent model view
我正在使用 flask-admin 构建产品管理员。产品可以有一个或多个变体集。例如,一件 T 恤可以有一个 "size" 集,其中包含 S、M、L 的记录。一件夹克可以有 "size" 和 "color"(红色、绿色、黄色等)套。
理想情况下 我希望管理员能够从产品视图中增删改查所有产品变体。产品视图上的所有其他字段只是模型的常规 flask-admin 默认字段。示例草图:
我是 flask-admin 的新手,所以在我开始 hackjobing 之前,是否有以前走过的路径来在 flask-admin 驱动的 UI 中建立这种关系?我在考虑一些字段覆盖,它可以在页内或模式 window?
中加载自定义小部件(或另一个模型视图)
我在 flask-sqlalchemy 中采用的方法的简化概述如下。
products
-----------------------------
| skuid | name |
-----------------------------
| B1234 | Test Product 1 |
-----------------------------
| B1235 | Test Product 2 |
-----------------------------
class Product(db.Model):
__tablename__ = 'products'
skuid = db.Column(db.String(16), primary_key=True)
name = db.Column(db.String(128))
variants = db.relationship("Option", secondary="products_to_options")
products_to_options
------------------------
| skuid | variant_set |
------------------------
| B1234 | B1234_1 |
------------------------
| B1234 | B1234_2 |
------------------------
| B1235 | B1235_1 |
------------------------
class ProductToOption(db.Model):
__tablename__ = 'products_to_options'
skuid = db.Column(db.String(16), db.ForeignKey('products.skuid'), nullable=False)
variant_set = db.Column(db.String(16), db.ForeignKey('options.variant_set'), nullable=False)
products = db.relationship('Product', foreign_keys="ProductToOption.skuid")
variants = db.relationship('Option', foreign_keys="ProductToOption.variant_set")
options
-----------------------------------------------------
| variant_set | code | variant_type | description |
-----------------------------------------------------
| B1234_1 | S | size | Small |
-----------------------------------------------------
| B1234_1 | M | size | Medium |
-----------------------------------------------------
| B1234_1 | L | size | Large |
-----------------------------------------------------
| B1234_2 | RD | color | Red |
-----------------------------------------------------
| B1234_2 | GR | color | Green |
-----------------------------------------------------
| B1234_2 | YL | color | Yellow |
-----------------------------------------------------
| B1235_1 | OK | wood | Oak |
-----------------------------------------------------
| B1235_1 | CH | wood | Cherry |
-----------------------------------------------------
class Option(db.Model):
__tablename__ = 'options'
variant_set = db.Column(db.String(16), nullable=False)
code = db.Column(db.String(8), nullable=False)
variant_type = db.Column(db.String(16), db.ForeignKey('option_types.id'), nullable=False)
description = db.Column(db.String(16), nullable=False)
product = db.relationship("Product", secondary="products_to_options")
type = db.relationship("OptionType", foreign_keys="Option.variant_type")
option_types
------------------------
| id | description |
------------------------
| size | Garment Size |
------------------------
| color | Garment Color|
------------------------
| wood | Wood Type |
------------------------
| ring | Ring Size |
------------------------
| shoe | Shoe Size |
------------------------
class OptionType(db.Model):
__tablename__ = 'option_types'
id = db.Column(db.String(16), primary_key=True)
description = db.Column(db.String(36), nullable=False)
看来您实际上是在尝试此处的 parent-child-child 构造行,其中第一个 child 是集合。例如,产品有 child 服装尺码,其 child table 包含小号、中号和大号。因此,如果您将数据库模型更改为这个想法,那部分就可以工作了。
缺点是,据我所知,flask-admin 不能(还)提供支持 3 tables(parent、child 和它 child)。那必须是您需要自己构建的东西。
我正在使用 flask-admin 构建产品管理员。产品可以有一个或多个变体集。例如,一件 T 恤可以有一个 "size" 集,其中包含 S、M、L 的记录。一件夹克可以有 "size" 和 "color"(红色、绿色、黄色等)套。
理想情况下 我希望管理员能够从产品视图中增删改查所有产品变体。产品视图上的所有其他字段只是模型的常规 flask-admin 默认字段。示例草图:
我是 flask-admin 的新手,所以在我开始 hackjobing 之前,是否有以前走过的路径来在 flask-admin 驱动的 UI 中建立这种关系?我在考虑一些字段覆盖,它可以在页内或模式 window?
中加载自定义小部件(或另一个模型视图)我在 flask-sqlalchemy 中采用的方法的简化概述如下。
products
-----------------------------
| skuid | name |
-----------------------------
| B1234 | Test Product 1 |
-----------------------------
| B1235 | Test Product 2 |
-----------------------------
class Product(db.Model):
__tablename__ = 'products'
skuid = db.Column(db.String(16), primary_key=True)
name = db.Column(db.String(128))
variants = db.relationship("Option", secondary="products_to_options")
products_to_options
------------------------
| skuid | variant_set |
------------------------
| B1234 | B1234_1 |
------------------------
| B1234 | B1234_2 |
------------------------
| B1235 | B1235_1 |
------------------------
class ProductToOption(db.Model):
__tablename__ = 'products_to_options'
skuid = db.Column(db.String(16), db.ForeignKey('products.skuid'), nullable=False)
variant_set = db.Column(db.String(16), db.ForeignKey('options.variant_set'), nullable=False)
products = db.relationship('Product', foreign_keys="ProductToOption.skuid")
variants = db.relationship('Option', foreign_keys="ProductToOption.variant_set")
options
-----------------------------------------------------
| variant_set | code | variant_type | description |
-----------------------------------------------------
| B1234_1 | S | size | Small |
-----------------------------------------------------
| B1234_1 | M | size | Medium |
-----------------------------------------------------
| B1234_1 | L | size | Large |
-----------------------------------------------------
| B1234_2 | RD | color | Red |
-----------------------------------------------------
| B1234_2 | GR | color | Green |
-----------------------------------------------------
| B1234_2 | YL | color | Yellow |
-----------------------------------------------------
| B1235_1 | OK | wood | Oak |
-----------------------------------------------------
| B1235_1 | CH | wood | Cherry |
-----------------------------------------------------
class Option(db.Model):
__tablename__ = 'options'
variant_set = db.Column(db.String(16), nullable=False)
code = db.Column(db.String(8), nullable=False)
variant_type = db.Column(db.String(16), db.ForeignKey('option_types.id'), nullable=False)
description = db.Column(db.String(16), nullable=False)
product = db.relationship("Product", secondary="products_to_options")
type = db.relationship("OptionType", foreign_keys="Option.variant_type")
option_types
------------------------
| id | description |
------------------------
| size | Garment Size |
------------------------
| color | Garment Color|
------------------------
| wood | Wood Type |
------------------------
| ring | Ring Size |
------------------------
| shoe | Shoe Size |
------------------------
class OptionType(db.Model):
__tablename__ = 'option_types'
id = db.Column(db.String(16), primary_key=True)
description = db.Column(db.String(36), nullable=False)
看来您实际上是在尝试此处的 parent-child-child 构造行,其中第一个 child 是集合。例如,产品有 child 服装尺码,其 child table 包含小号、中号和大号。因此,如果您将数据库模型更改为这个想法,那部分就可以工作了。
缺点是,据我所知,flask-admin 不能(还)提供支持 3 tables(parent、child 和它 child)。那必须是您需要自己构建的东西。