2017-03-07 53 views
0

在我SQLAlchemy的班,我有以下類別:嵌套棉花糖領域和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的我沒有得到任何結果(字典沒有任何對Foo或Bar類的引用)。

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

如何獲得FooBarSchema結果中的Foo和Bar類?

回答

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。

如果並且只有在關聯表中沒有額外的數據時,我們可以更改一些內容。我們可以使用relationship()的參數secondary。 我們必須保持類作爲您目前擁有和類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也能夠在Foo.barsBar列表。

現在我們必須配置BarSchemaFooSchema類。

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) 

exclude是爲了避免遞歸問題。