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