Вложенные поля с mashmallow_sqlalchemy и flask_marshmallow - PullRequest
0 голосов
/ 16 марта 2020

Я пытаюсь получить вложенный сериализованный вывод, но все, что я получаю, это сторона «много» первичного ключа таблицы «многие к одному».

Ожидаемый вывод:

[{'part_numbers': 
                 {'part_number': '23103048', 'description': 'blue product'},
  'machines': 2,
  'percent_complete': 5.0,
  'serial_number': '001',
  'timestamp_created': 2020-03-12T15:4:23.135098},
 {'part_numbers': 
                 {'part_number': '44444009', 'description': 'red product'},
  'machines': 1,
  'percent_complete': 60.0,
  'serial_number': '002',
  'timestamp_created': '2020-03-12T15:44:23.135098'}]

Фактический вывод:

[{'id': 3,
  'machines': 2,
  'percent_complete': 5.0,
  'serial_number': '001',
  'timestamp_created': 2020-03-12T15:4:23.135098},
 {'id': 1,
  'machines': 1,
  'percent_complete': 60.0,
  'serial_number': '0002',
  'timestamp_created': '2020-03-12T15:44:23.135098'}]

Это мои файлы. Я попытался добавить part_numbers = ma.Nested(PartNumbers) к схеме Machine внутри models.py, но это не изменило результат!

my_app
|--- my_app
     |--- \__init\__.py
     |--- models.py
     |--- views.py

models.py

from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow
from marshmallow_sqlalchemy import SQLAlchemyAutoSchema

db = SQLAlchemy()
ma = Marshmallow()

### Models ###

class Machine(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    serial_number = db.Column(db.Text, unique=True)
    percent_complete = db.Column(db.Float)
    part_number_id = db.Column(db.Integer, db.ForeignKey('PartNumbers.id'))
    timestamp_created = db.Column(db.DateTime, default=datetime.utcnow)

class PartNumbers(db.Model):
    __tablename__ = 'PartNumbers'

    id = db.Column(db.Integer, primary_key=True)
    part_number = db.Column(db.Text, unique=True)
    description = db.Column(db.Text)
    machines = db.relationship('Machines', backref='machines', lazy='dynamic')


### Schemas ###

class PartNumbersSchema(SQLAlchemyAutoSchema):
    class Meta:
        model = PartNumbers
        include_fk = True

class MachineSchema(SQLAlchemyAutoSchema):
    class Meta:
        model = Machines
        include_relationships = True

__ init __. Py

from flask import Flask
from .models import db, ma
from .views import my_app

app = Flask(__name__)
db.init_app(app)
ma.init_app(app)
app.register_blueprint(my_app)

views.py

from flask import Blueprint
from .models import db, Machines, MachineSchema, PartNumbers

my_app = Blueprint("my_app", __name__)

machines_schema = MachineSchema(many=True)

@my_app.route('/')
def home()
    machines = db.session.query(Machines).all()
    return machines_schema.dump(machines)

1 Ответ

1 голос
/ 17 марта 2020
  1. Определение part_number в классе Machine:

    class Machine(db.Model):
      id = db.Column(db.Integer, primary_key=True)
      serial_number = db.Column(db.Text, unique=True)
      percent_complete = db.Column(db.Float)
      part_number_id = db.Column(db.Integer, db.ForeignKey('PartNumbers.id'))
      timestamp_created = db.Column(db.DateTime, default=datetime.utcnow)
      part_numbers = db.relationship('PartNumbers')
    
  2. Вы должны явно указать part_numbers в MachineSchema:

    from marshmallow_sqlalchemy import fields
    class MachineSchema(SQLAlchemyAutoSchema):
      class Meta:
        model = Machines
      part_numbers = fields.Nested(PartNumbersSchema)
    

Я предположил, что part_numbers - это один объект (отношение 1: 1). В противном случае вам нужно добавить многие = True к номерам деталей.

Подробнее: https://marshmallow.readthedocs.io/en/stable/nesting.html

[отредактировано для включения исправления в комментарии]

...