SQLAlchemy 双向关联代理

Sil*_*Ray 5 python sqlalchemy associations relationship

我正在尝试使用映射表创建一个简单的多对多关系,其中包含有关它使用 SQLAlchemy 两端的关联代理表示的关系的元数据。但是,我似乎无法让它发挥作用。这是我一直在尝试弄清楚的玩具示例:

Base = declarative_base()


def bar_creator(bar):

    _ = FooBar(bar=bar)
    return bar


class Foo(Base):

    __tablename__ = 'foo'

    id = Column(Integer, primary_key=True)
    name = Column(String)
    bars = association_proxy('bar_associations', 'bar',
                             creator=bar_creator)


def foo_creator(foo):

    _ = FooBar(foo=foo)
    return foo


class Bar(Base):

    __tablename__ = 'bar'

    id = Column(Integer, primary_key=True)
    name = Column(String)
    foos = association_proxy('foo_associations', 'foo',
                             creator=foo_creator)


class FooBar(Base):

    __tablename__ = 'fooBar'

    foo_id = Column(Integer, ForeignKey('foo.id'), primary_key=True)
    bar_id = Column(Integer, ForeignKey('bar.id'), primary_key=True)
    bazed = Column(Boolean)
    foo = relationship(Foo, backref='bar_associations')
    bar = relationship(Bar, backref='foo_associations')


Base.metadata.create_all(engine)
make_session = sessionmaker(bind=engine)
session = make_session()
foo0 = Foo(name='foo0')
session.add(foo0)
bar0 = Bar(name='bar0')
foo0.bars.append(bar0)
Run Code Online (Sandbox Code Playgroud)

我添加了这些creator函数,这样我就可以避免编写一个__init__不适用于我的实际用例(采用单个参数)的函数,并在每个函数中包含创建,FooBar因为我在一些文档中读到附加的项目已经需要有一个与之关联的链接表实例。我确信我只是错过了一些明显的事情(或者甚至可能试图做一些无法完成的事情),但是在深入研究文档和谷歌搜索之后,我不明白为什么它不起作用。我究竟做错了什么?

jav*_*vex 2

您的问题在于creator:它应该返回 and 的新实例FooBar,而不是baror foo

def bar_creator(value):
    return FooBar(bar=value)
Run Code Online (Sandbox Code Playgroud)

与 类似foo_creator