2017-03-07 1 views
0

Dans mes cours de sqlalchemy je les classes suivantes:Nested champs Guimauve et les relations 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) 

Lorsque je tente d'imbriquer les classes Foo ou Bar dans un schéma Guimauve pour FooBar Je ne reçois aucun résultat (les dictionnaires n'ont aucune référence aux classes Foo ou Bar).

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

Comment puis-je obtenir les classes Foo et Bar dans les résultats de FooBarSchema?

Répondre

0

Ok ... Je vais vous donner la solution à votre problème. Mais en analysant votre code, je pense que nous pouvons le rendre plus pythonique.

Si, et seulement si, vous n'avez pas de données supplémentaires dans la table d'association, nous pouvons changer certaines choses. En regardant les documents SQLAlchemy pour une relation Many To Many, nous pouvons utiliser le paramètre secondary du relationship(). Nous devons garder la classe que vous avez actuellement et la classe Bar comme ça:

class Bar(Model): 
    __tablename__ = 'bar' 
    nr = Column('nr', Integer, primary_key=True) 
    bar_name = Column('name',String) 
    foos = relationship("Foo", secondary="foobar", backref="bars") 

Ainsi, dans Bar.foos nous avons une liste de Foo objets, et la backref permet également d'avoir une liste Bar dans Foo.bars. Maintenant, nous devons configurer les classes BarSchema et 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) 

Le exclude est d'éviter les problèmes récursifs.