【问题标题】:flask-admin + sqlalchemy - modify "sets" of related records in parent model viewflask-admin + sqlalchemy - 在父模型视图中修改相关记录的“集合”
【发布时间】:2020-03-05 10:32:57
【问题描述】:

我正在使用 flask-admin 构建产品管理员。产品可以有一个或多个变体集。例如,一件 T 恤可以有一个“尺码”集,其中包含 S、M、L 的记录。一件夹克可以有“尺码”和“颜色”(红、绿、黄等)集。

理想情况下我希望管理员能够从产品视图中对所有产品变体进行 CRUD。产品视图上的所有其他字段将只是模型的常规烧瓶管理默认字段。示例草图:

我是 flask-admin 的新手,所以在我开始 hackjobbing 之前,是否有以前曾走过的路径可以在 flask-admin 驱动的 UI 中建立这种关系?我正在考虑在页面内或模式窗口中加载自定义小部件(或另一个模型视图)的某些字段覆盖?

下面是我使用 flask-sqlalchemy 所采用的方法的简化大纲。

产品

-----------------------------
| 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")

选项

-----------------------------------------------------
| 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)

【问题讨论】:

    标签: flask sqlalchemy flask-sqlalchemy flask-wtforms flask-admin


    【解决方案1】:

    看起来你实际上是在尝试父子子构造线中的一些东西,其中第一个孩子是集合。例如,产品有子服装尺码,其子表包含小号、中号和大号。所以如果你把你的数据库模型改成这个想法,那部分就可以工作了。

    缺点是,据我所知,flask-admin(还)不能提供支持 3 个表(父、子及其子)的创建选项卡。那一定是你需要自己建立的东西。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    • 2019-05-22
    • 2016-10-18
    • 1970-01-01
    相关资源
    最近更新 更多