在SQLAlchemy中对三个表进行多对多建模

时间:2018-11-10 20:00:40

标签: python sql sqlalchemy

我很难为这些关系建模。

有些产品,每个产品都属于一个product_type。 product_types具有不同功能的列表,例如。颜色,大小,重量,体积,多对多关系。每个功能依次具有不同的feature_options。红色,蓝色,绿色,黑色为颜色。最后,产品具有一些feature_options。一个例子应该是产品BIC2006,它具有product_type笔,其特征是颜色和重量,并且在这些特征中具有feature_options红色和蓝色(颜色为1g和2g)。

最后,我想按产品存储feature_options并按产品查询按功能列出的feature_options列表:

BIC2006-笔

颜色:红色,蓝色

重量:1g,2g

与SQLAlchemy一起使用的最佳数据库模型应该是什么?

就目前而言,由于我需要按尝试使用的产品存储feature_options,但是我不确定如何检索按功能排序:

class ProductTypes_Features(Base):
    __tablename__ = 'product_types_features'
    product_type_id = Column(Integer, ForeignKey('product_types.id'), primary_key=True)
    feature_id = Column(Integer, ForeignKey('features.id'), primary_key=True)

class Feature_FeatureOptions(Base):
    __tablename__ = 'feature_feature_options'
    feature_id = Column(Integer, ForeignKey('features.id'), primary_key=True)
    feature_options_id = Column(Integer, ForeignKey('feature_options.id'), primary_key=True)

class Product_FeatureOptions(Base):
    __tablename__ = 'product_feature_options'
    product_id = Column(Integer, ForeignKey('products.id'), primary_key=True)
    feature_options_id = Column(Integer, ForeignKey('feature_options.id'), primary_key=True)
    feature_id = Column(Integer, ForeignKey('features.id'))   #??

class Products(Base):
    __tablename__ = 'product'
    id = Column(Integer, primary_key=True)
    product_type_id = Column(Integer, ForeignKey('product_types.id'))
    feature_options = relationship("Product_FeatureOptions")

class FeatureOptions(Base):
    __tablename__ = 'feature_options'
    id = Column(Integer, primary_key=True)

class Features(Base):
    __tablename__ = 'features'
    id = Column(Integer, primary_key=True)
    feature_options = relationship("Feature_FeatureOptions")

class ProductTypes(Base):
    __tablename__ = 'product_types'
    id = Column(Integer, primary_key=True)
    features = relationship("ProductType_Features")

如何查询?

session.query(Products.id, 
    Products.feature_options.feature_id,
    Products.feature_options.feature_option_id).
    order_by(...).all()

非常感谢您的最佳做法建议!

0 个答案:

没有答案