首页 > 解决方案 > 如何使用 flask-sqlachemy 生成以下 json?

问题描述

我正在使用flask-sqlalchemymarshmallow在 python 中创建一个 API 端点。例如,我有两个集合/表,一个是items,另一个是stores。商品将具有 item_id、item_name、item_price 和 available stores_list 等属性。Store 将具有 store_id、store_name、store_location 和 available items_list 等属性。当我请求项目列表时,我需要以下 JSON 响应。

[
    {
        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
]

当我请求商店列表时,我需要以下 JSON 响应。

[
    {
        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
]

到目前为止,我已经尝试了以下

#项目模型

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()

店铺型号

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()

模式

# 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

资源

# 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

以下是app启动的代码

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)

标签: python-3.xflask-sqlalchemyflask-marshmallow

解决方案


看起来 jsonify 是你的朋友... https://www.google.com/search?q=flask+sqlalchemy+to+json


推荐阅读