0

I am creating a API endpoints using flask-sqlalchemy and marshmallow in python. For example I have two collections/tables one is items and other is stores. Items will have attributes like item_id, item_name, item_price and available stores_list. Store will have attributes like store_id, store_name, store_location and available items_list. I require the following JSON response when i request list of items.

[
    {
        item_id:1,
        item_name:"Laptop",
        item_price:"20",
        store_list:[
            {
                store_id:1,
                store_name:"ABC",
                store_location:"USA"
            },
            {
                store_id:2,
                store_name:"BBC",
                store_location:"USA"
            },
            {
                store_id:3,
                store_name:"CBC",
                store_location:"USA"
            }
        ]
    },
     {
        item_id:2,
        item_name:"Laptop",
        item_price:"20",
        store_list:[
            {
                store_id:1,
                store_name:"ABC",
                store_location:"USA"
            },
            {
                store_id:2,
                store_name:"BBC",
                store_location:"USA"
            },
            {
                store_id:3,
                store_name:"CBC",
                store_location:"USA"
            }
        ]
    }

    ......... and so on
]

I require the following JSON response when i request list of stores.

[
    {
        store_id:1,
        store_name:"ABC",
        store_location:"USA",
        items_list:[
            {
                items_id:1,
                items_name:"Laptop",
                items_price:"65"
            },
            {
                items_id:2,
                items_name:"Keyboard",
                items_price:"56"
            },
            {
                items_id:3,
                items_name:"Mouse",
                items_price:"56"
            }
        ]
    },
     {
        store_id:2,
        store_name:"BBC",
        store_location:"UK",
        items_list:[
            {
                items_id:1,
                items_name:"Laptop",
                items_price:"23"
            },
            {
                items_id:2,
                items_name:"BBC",
                items_price:"Speaker"
            },
            {
                items_id:3,
                items_name:"Mouse",
                items_price:"24"
            }
        ]
    }

    ......... and so on
]

So far I have tried the following

#ITEMS MODEL

from requests import Response
from flask import request, url_for
from datetime import datetime
from typing import List
from db import db

from models.store import Stores


#Bartiny Ingredients Generic Types Model

class Items(db.Model):
    __tablename__ = "items"

    item_id = db.Column(db.Integer, primary_key=True)
    item_name = db.Column(db.String(100), nullable=False,)
    item_price = db.Column(db.String(10), nullable=False,)


    store_lsit = db.relationship('Stores', backref=db.backref('items'))


    @classmethod
    def find_by_name(cls, name: str) -> "Items":
        return cls.query.filter_by(gen_type_name=name).first()

    @classmethod
    def find_by_id(cls, _id: int) -> "Items":
        return cls.query.filter_by(id=_id).first()

    @classmethod
    def find_all(cls) -> List["Items"]:
        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()

STORE MODEL

from requests import Response
from flask import request, url_for
from datetime import datetime
from typing import List
from db import db

from models.items import Items


#Bartiny Ingredients Generic Types Model

class Stores(db.Model):
    __tablename__ = "stores"

    store_id = db.Column(db.Integer, primary_key=True)
    store_name = db.Column(db.String(100), nullable=False,)
    store_locations = db.Column(db.String(10), nullable=False,)


    items_list = db.relationship('Items', backref=db.backref('stores'))


    @classmethod
    def find_by_name(cls, name: str) -> "Stores":
        return cls.query.filter_by(gen_type_name=name).first()

    @classmethod
    def find_by_id(cls, _id: int) -> "Stores":
        return cls.query.filter_by(id=_id).first()

    @classmethod
    def find_all(cls) -> List["Stores"]:
        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()

SCHEMAS

# Items Schema
from ma import ma
from marshmallow import pre_dump
from models.item import Items


class ItemsSchema(ma.ModelSchema):

    class Meta:
        model = Items

# Store Schema
from ma import ma
from marshmallow import pre_dump
from models.store import Stores


class StoresSchema(ma.ModelSchema):

    class Meta:
        model = Stores

Resources

# Store Resource

from flask_restful import Resource
from models.store import Stores
from schemas.store import StoresSchema

store_list_schema = StoreSchema(many=True)


class StoreList(Resource):
    @classmethod
    def get(cls):
        return {"stores": store_list_schema.dump(Stores.find_all())}, 200


# Items Resource

from flask_restful import Resource
from models.item import Items
from schemas.item import ItemsSchema

item_list_schema = ItemsSchema(many=True)


class StoreList(Resource):
    @classmethod
    def get(cls):
        return {"items": item_list_schema.dump(Items.find_all())}, 200

The following is the code for app starting

from flask import Flask, jsonify
from flask_restful import Api
from marshmallow import ValidationError

from db import db
from ma import ma
from resources.item import Item, ItemList
from resources.store import Store, StoreList

app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///data.db"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
api = Api(app)


@app.before_first_request
def create_tables():
    db.create_all()


@app.errorhandler(ValidationError)
def handle_marshmallow_validation(err):
    return jsonify(err.messages), 400


jwt = JWTManager(app)


api.add_resource(StoreList, "/stores")
api.add_resource(ItemList, "/items")

if __name__ == "__main__":
    db.init_app(app)
    ma.init_app(app)
    app.run(port=5000, debug=True)
Himavan
  • 385
  • 3
  • 16

1 Answers1

0

Looks like jsonify is your friend... https://www.google.com/search?q=flask+sqlalchemy+to+json

jim collins
  • 417
  • 1
  • 8
  • 17