如何使用Dict [str,str]作为sqlalchemy中的关系属性

时间:2018-08-08 14:12:29

标签: python sqlalchemy

假设我有一个模型,从概念上讲,它应该只是父本从一种简单类型到另一种简单类型的字典。我尝试实现自定义集合类,但似乎这不是正确的方法,因为自定义集合在将其添加到集合时应将类型L1作为参数。但是我想要的界面是Root(children={'a': 'a'})

class L1(Base):

__tablename__ = 'l1s'

id = sa.Column(sa.Integer, primary_key=True)
parent_id = sa.Column(sa.Integer, sa.ForeignKey('roots.id'))
name = sa.Column(sa.String, unique=True)
value = sa.Column(sa.String)





class Root(Base):

__tablename__ = 'roots'

id = sa.Column(sa.Integer, primary_key=True)
name = sa.Column(sa.String, unique=True)
children = relationship('L1', backref='parent', collection_class=partial(AsSimpleDict, L1, 'name', 'value'))

1 个答案:

答案 0 :(得分:0)

我认为您可能正在寻找的是collection_class关系和association_proxy的结合。

class Parent(declarative.Base):
    __tablename__ = 'parent'

    id = Column("parent_id", Integer, primary_key=True)

    _config = relationship("Config",
                           collection_class=attribute_mapped_collection('key'),
                           cascade="all, delete-orphan")
    config = association_proxy('_config', 'value',
                               creator=lambda k, v: Config(key=k, value=v))

class Config(declarative.Base):
    __tablename__ = 'config'

    id = Column("config_id", Integer, primary_key=True)

    parent_id = Column(Integer, ForeignKey('parent.parent_id'))
    playlist = relationship("Parent", back_populates="_config")
    key = Column(String)
    value = Column(String)

我的理解是,在此示例中,_config实际上是key -> Config object字典,并且关联代理将其接受并将其表示为key -> value字典。最后,creator函数将parent.config[key] = value的分配转换为幕后Config对象的创建。