# ma.py
from flask_marshmallow import Marshmallow
ma = Marshmallow()
# app.py
from ma import ma
if __name__ == "__main__":
db.init_app(app)
ma.init_app(app)
app.run(port=5000, debug=True)
model (no marshmallow here)
# /models/item.py
from typing import List
from db import db
class ItemModel(db.Model):
__tablename__ = "items"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), nullable=False, unique=True)
price = db.Column(db.Float(precision=2), nullable=False)
store_id = db.Column(db.Integer, db.ForeignKey("stores.id"), nullable=False)
store = db.relationship("StoreModel")
# no __init__ method
@classmethod
def find_by_name(cls, name: str) -> "ItemModel":
return cls.query.filter_by(name=name).first()
@classmethod
def find_all(cls) -> List["ItemModel"]:
return cls.query.all()
def save_to_db(self) -> None:
db.session.add(self)
db.session.commit()
def delete_from_db(self) -> None:
db.session.delete(self)
db.session.commit()
schema (fields are defined by models)
# /schemas/item.py
from ma import ma
from models.item import ItemModel
from models.store import StoreModel
class ItemSchema(ma.ModelSchema):
class Meta:
model = ItemModel
load_only = ("store",)
dump_only = ("id",)
include_fk = True # store_id
resource
from models.item import ItemModel
from schemas.item import ItemSchema
item_schema = ItemSchema()
item_list_schema = ItemSchema(many=True)
class Item(Resource):
@classmethod
def get(cls, name: str):
item = ItemModel.find_by_name(name)
if item:
return item_schema.dump(item), 200 # dump to json
return {"message": ITEM_NOT_FOUND}, 404
@classmethod
@fresh_jwt_required
def post(cls, name: str):
if ItemModel.find_by_name(name):
return {"message": NAME_ALREADY_EXISTS.format(name)}, 400
item_json = request.get_json()
item_json["name"] = name
item = item_schema.load(item_json) # load to object
try:
item.save_to_db()
except:
return {"message": ERROR_INSERTING}, 500
return item_schema.dump(item), 201
...
class ItemList(Resource):
@classmethod
def get(cls):
return {"items": item_list_schema.dump(ItemModel.find_all())}, 200 # list schema
2.2. Nested schema
# /schema/store.py
from ma import ma
from models.store import StoreModel
from models.item import ItemModel
from schemas.item import ItemSchema
class StoreSchema(ma.ModelSchema):
items = ma.Nested(ItemSchema, many=True) # nested
class Meta:
model = StoreModel
dump_only = ("id",)
include_fk = True