2017-01-25 5 views
0

Ich baue eine kleine REST API mit Flask, Flasche-Sqlalchemy und Kolben-Marshmallow. Für einige Anfragen möchte ich eine json serialisierte Antwort zurückgeben, die aus meinen sqlalchemy-Objekten besteht. Allerdings kann ich nicht die Serialisierung mit eifrig geladenen Sqlalchemy-Objekten arbeiten, wenn Sie viele-zu-viele Beziehungen/Sekundärtabellen verwenden.Flask Marshmallow/SqlAlchemy: Serialisierung von vielen zu vielen Beziehungen

Hier ist ein einfaches Beispiel, mehr oder weniger Kopieren/von Kolben-Eibisch docs eingefügt:

from flask import Flask 
from flask_sqlalchemy import SQLAlchemy 
from flask_marshmallow import Marshmallow 
from sqlalchemy.orm import joinedload 

app = Flask(__name__) 
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite://' 

# Order matters: Initialize SQLAlchemy before Marshmallow 
db = SQLAlchemy(app) 
ma = Marshmallow(app) 

secondary_foo = db.Table('secondary_foo', 
          db.Column('author_id', db.Integer, db.ForeignKey('author.id')), 
          db.Column('book_id', db.Integer, db.ForeignKey('book.id'))) 

class Author(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(255)) 

class Book(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    title = db.Column(db.String(255)) 
    authors = db.relationship('Author', secondary="secondary_foo", backref='books', lazy="joined") 

class AuthorSchema(ma.ModelSchema): 
    class Meta: 
     model = Author 

class BookSchema(ma.ModelSchema): 
    #authors = ma.Nested(AuthorSchema) <-- Doesn't work, authors will be serialized to empty json object, instead of list of ids 
    class Meta: 
     model = Book 


db.drop_all() 
db.create_all() 
author_schema = AuthorSchema() 
book_schema = BookSchema() 
author = Author(name='Chuck Paluhniuk') 
book = Book(title='Fight Club') 
book.authors.append(author) 
db.session.add(author) 
db.session.add(book) 
db.session.commit() 

s = BookSchema(many=True) 

auf dem obigen Code Basierend ich eifrig Bücher laden und auch die Autoren Objekte erhalten. Aber wenn die tiefen Objekte serialisiert werden in eine Liste von IDs serialisiert:

print(Book.query.filter(1==1).options(joinedload('authors')).all()[0].authors) 
//--> [<__main__.Author object at 0x1043a0dd8>] 

print(s.dump(Book.query.filter(1==1).options(joinedload('authors')).all()).data) 
//--> [{'authors': [1], 'title': 'Fight Club', 'id': 1}] 

Dies ist das Ergebnis Ich möchte:

print(s.dump(Book.query.filter(1==1).options(joinedload('authors')).all()).data) 
//--> [{'authors': [{'name':'Chuck Paluhniuk', 'id':'1'}], 'title': 'Fight Club', 'id': 1}] 

Wie zum Teufel mache ich das :-)?

Antwort

1

In Ihrem BookSchema, möchten Sie ein Nestedauthors Feld hinzufügen, wie Sie hatte (aber auf Kommentar), aber Sie werden festlegen wollen, dass es mit Hilfe der many keyword argument eine Liste sein.

class BookSchema(ma.ModelSchema): 

    # A list of author objects 
    authors = ma.Nested(AuthorSchema, many=True) 

    class Meta: 
     model = Book 
+0

Brilliant, danke! Ich muss Stunden damit verbracht haben, Flaschen-Marshmallow, Flasch-Sqlalchemy, Sqlalchemy und Marshmallow Docs durchzugehen. – MSurrow

Verwandte Themen