嵌套的棉花糖田和Sqlalchemy关系

时间:2017-03-07 07:00:11

标签: python sqlalchemy marshmallow

在我的sqlalchemy课程中,我有以下课程:

class FooBar(Model):
    __tablename__ = ‘foobar’
    id = Column('id', Integer, primary_key=True)

    foonr = Column('foonr', Integer, ForeignKey('foo.nr'), nullable=False)
    barnr = Column('barnr', String, ForeignKey('bar.nr'), nullable=False)

class Foo(Model):
    __tablename__ = ‘foo’
    nr = Column('nr', Integer, primary_key=True)
    foo_name = Column(‘name’,String)


class Bar(Model):
   __tablename__ = ‘bar’
   nr = Column('nr', Integer, primary_key=True)
   bar_name = Column(‘name’,String)
   foo_bar = relationship('foobar', uselist=False)

当我尝试在FooBar的Marshmallow Schema中嵌套类Foo或Bar时,我没有得到任何结果(字典没有对Foo或Bar类的任何引用)。

class FooBarSchema(Schema):
   id = fields.Int()
   foo = fields.Nested('FooSchema', many=False)
   bar = fields.Nested('BarSchema', many=False)

如何在FooBarSchema的结果中获取Foo和Bar类?

1 个答案:

答案 0 :(得分:0)

好的......我会给你解决问题的方法。

class FooBar(Model):
    __tablename__ = 'foobar'
    id = Column('id', Integer, primary_key=True)
    foonr = Column('foonr', Integer, ForeignKey('foo.nr'), nullable=False)
    barnr = Column('barnr', String, ForeignKey('bar.nr'), nullable=False)
    foo = relationship("Foo", uselist=False)
    bar = relationship("Bar", uselist=False)

class FooBarSchema(Schema):
    id = fields.Int()   
    foo = fields.Nested('FooSchema', many=False)
    bar = fields.Nested('BarSchema', many=False)

但是分析你的代码我觉得我们可以把它变成pythonic。

如果且仅当您在关联表中没有额外数据时,我们可以更改一些内容。

查看SQLAlchemy doc的Many To Many关系,我们可以使用secondary的{​​{1}}参数。 我们必须按照您目前的课程和课程relationship()进行课程设置:

Bar

因此,在class Bar(Model): __tablename__ = 'bar' nr = Column('nr', Integer, primary_key=True) bar_name = Column('name',String) foos = relationship("Foo", secondary="foobar", backref="bars") 中,我们有Bar.foos个对象的列表,而Foo也可以在backref中创建Bar列表。< / p>

现在我们必须配置Foo.barsBarSchema类。

FooSchema

class FooSchema(Schema): nr = fields.Int() foo_name = fields.Str() bars = fields.Nested('BarSchema', exclude=('foos',), many=True) class BarSchema(Schema): nr = fields.Int() bar_name = fields.Str() foos = fields.Nested('FooSchema', exclude=('bars',), many=True) 是为了避免递归问题。