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

3

假设我有一个模型,它在概念上应该只是从一种简单类型到另一种父类型的字典。我尝试实现自定义集合类,但似乎这不是正确的方法,因为自定义集合应该将类型 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个回答

2
我认为你可能需要的是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 对象。


谢谢,我不知道可以这样使用association_proxy。太棒了! - user1685095

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,