2016-04-18 13 views
3

Ich verwende Marshmallow-Sqlalchemy mit Flaschenextension und versuchen, die Lade-Methode meiner ModelSchema-Klasse zu verwenden. Ich habe so etwas wie dies:Verwenden von Laden mit verschachtelten Objekten in Marshmallow-Sqlalchemy

db = SQLAlchemy() 
ma = Marshmallow() 

#I'm using Application Factorie 
def create_app(): 
    ... 
    db.init_app(app) 
    ma.init_app(app) 
    ... 
    return app 


class BaseSchema(ma.ModelSchema):  
    class Meta: 
     sqla_session = db.session 

class Parent(db.Model):  
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(45), nullable=False) 
    child_id = db.Column(db.Integer, db.ForeignKey("child.id"), nullable=False) 
    child = db.relationship("Child") 

class ParentSchema(BaseSchema): 
    class Meta: 
     model = Parent 
    child = ma.Nested("ChildSchema") 

class Child(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(25), nullable=False) 

class ChildSchema(BaseSchema): 
    class Meta: 
     model = Child 

Insgesamt funktioniert perfekt, Abfragen, fügt ... Aber wenn ich versuche, wie ein neues übergeordnetes Objekt mit einem vorhandenen Kind in der Datenbank zu laden: new_parent = ParentSchema().load({'name':'Foo', 'child' : {'id':1,'name':'Bar'} }) kehrt es AttributeError: 'DummySession' object has no attribute 'query'.

Was mache ich falsch?

Antwort

4

Ich denke, dass die Meta-Klasse Ihres BaseSchema nicht ordnungsgemäß vererbt wird.

Ändern Sie diese

class ParentSchema(BaseSchema): 
    class Meta: 
     model = Parent 

dieser

class ParentSchema(BaseSchema): 
    class Meta(BaseSchema.Meta): 
     model = Parent 

Referenz: https://marshmallow-sqlalchemy.readthedocs.io/en/latest/recipes.html (Basis Schema I Beispiel)

+1

Das ist richtig. Vielen Dank. –