flask-admin + sqlalchemy - изменить «наборы» связанных записей в представлении родительской модели - PullRequest
0 голосов
/ 08 ноября 2019

Я создаю администратора продукта с помощью flask-admin. Продукты могут иметь один или несколько вариантов набора. Например, футболка может иметь набор «размер», содержащий записи для S, M, L. Куртка может иметь наборы «размер» и «цвет» (красный, зеленый, желтый и т. Д.).

В идеале Я бы хотел, чтобы администраторы могли CRUD все варианты продукта из представления продукта. Все остальные поля в представлении продукта будут обычными полями по умолчанию для флеш-администратора для модели. Пример эскиза:

enter image description here

Я новичок в flask-admin, поэтому, прежде чем я начну заниматься этим, есть ли ранее пройденный путь для сборкитакие отношения в пользовательском интерфейсе, управляемом администратором? Я думаю, что какое-то переопределение поля, которое загружает пользовательский виджет (или другой вид модели) либо на странице, либо в модальном окне?

Ниже приведен упрощенный план подхода, который я использую с 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)

1 Ответ

1 голос
/ 13 ноября 2019

Может показаться, что вы на самом деле что-то пробуете в строке конструкции parent-child-child, где первый дочерний элемент - это множество. Например, у продукта есть дочерний размер одежды, а его дочерний стол содержит малые, средние и большие размеры. Поэтому, если вы измените свою модель БД на эту идею, эта часть может работать.

Недостатком является то, что, насколько я знаю, flask-admin не может (пока) предоставить вкладку создания, которая поддерживает 3 таблицы (родительский,ребенок и его ребенок). Это должно быть что-то, что вам нужно построить самостоятельно.

...