簡體   English   中英

使用 Flask-Marshmallow 和 SQLAlchemy 清空 Json

[英]Empty Json using Flask-Marshmallow and SQLAlchemy

我正在嘗試創建一個端點以從兩個表指示符元數據返回數據,因此我創建了下面的 model, indicator = db.relationship('Indicator', backref='metadatas')indicator_id = db.Column(db.Integer, db.ForeignKey('indicator.id'))但是當我調用api/indicators時,我得到了空的 json,你可以在最后看到,為什么?

模型.py

from datetime import datetime
from app import db, ma

class Indicator(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    unique_key = db.Column(db.String(32))
    name = db.Column(db.String(255))
    short_name = db.Column(db.String(255))
    valid = db.Column(db.Boolean)
    created_at = db.Column(db.DateTime())
    last_updated_at = db.Column(db.DateTime())

class Metadata(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    indicator_id = db.Column(db.Integer, db.ForeignKey('indicator.id'))
    indicator = db.relationship('Indicator', backref='metadatas')
    type = db.Column(db.String(255))
    inputs = db.Column(db.String(255))
    options = db.Column(db.String(255))
    outputs = db.Column(db.String(255))

class IndicatorSchema(ma.SQLAlchemySchema):
    class Meta:
        model = Indicator 

    id: ma.auto_field()
    unique_key: ma.auto_field()
    name: ma.auto_field()
    short_name: ma.auto_field()
    valid: ma.auto_field()

class MetadataSchema(ma.SQLAlchemyAutoSchema):
    class Meta:
        model = Metadata
        include_fk = True

您可以在下面看到其他文件:

應用程序.py

from flask_jwt_extended import JWTManager
from flask import Flask, jsonify, request
from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow

app = Flask(__name__)
app.config["JWT_SECRET_KEY"] = "fe7e8955db51c0ff78550419434128cb"
app.config["JWT_ACCESS_TOKEN_EXPIRES "] = 28800
app.config['SQLALCHEMY_DATABASE_URI'] = "sqlite:////tmp/test.db"
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
app.config['JSON_SORT_KEYS'] = False

db = SQLAlchemy(app)
ma = Marshmallow(app)

controller.py

from flask_jwt_extended import jwt_required, create_access_token, get_jwt_identity
from flask import Flask, request, jsonify
from models import Indicator, Metadata, IndicatorSchema, MetadataSchema
from config import conn_string
from app import app, db
import services
import hashlib
import json

@app.route('/api/indicators', methods=['GET'])
@jwt_required()
def indicators():
    short_name = request.args.get('short_name',None)

    if short_name is not None:
        indicator = Indicator.query.filter_by(short_name = short_name).first()
        indicator_schema = IndicatorSchema()
        output = indicator_schema.dump(indicator)

    else:
        indicators = Indicator.query.all()
        indicators_schema = IndicatorSchema(many=True)
        output = indicators_schema.dump(indicators)

    return jsonify(output), 200

當我調用/api/indicators時,我得到響應200但為空 JSON:

$ http :5000/api/indicators 
HTTP/1.0
Content-Type: application/json
Server: Werkzeug/2.0.0 Python/3.8.5
[
    {},
    {},
    {},
    {},
    {},
    {}
]

我認為有兩個問題:

  1. 您應該在Indicator model 上定義關系(一個具有許多元數據的指標)
  2. 我相信您正在尋找元屬性include_relationships ,因為您希望返回的不僅僅是外鍵 ID

您的代碼進行了調整:

from datetime import datetime
from app import db, ma

class Indicator(db.Model):
    __tablename__ = "indicator"
    id = db.Column(db.Integer, primary_key=True)
    unique_key = db.Column(db.String(32))
    name = db.Column(db.String(255))
    short_name = db.Column(db.String(255))
    valid = db.Column(db.Boolean)
    created_at = db.Column(db.DateTime())
    last_updated_at = db.Column(db.DateTime())
    metadatas = db.relationship('Metadata', backref='indicator')

class Metadata(db.Model):
    __tablename__ = "metadata"
    id = db.Column(db.Integer, primary_key=True)
    indicator_id = db.Column(db.Integer, db.ForeignKey('indicator.id'))
    type = db.Column(db.String(255))
    inputs = db.Column(db.String(255))
    options = db.Column(db.String(255))
    outputs = db.Column(db.String(255))

class IndicatorSchema(ma.SQLAlchemyAutoSchema):
    class Meta:
        model = Indicator
        include_relationships = True

    id: ma.auto_field()
    unique_key: ma.auto_field()
    name: ma.auto_field()
    short_name: ma.auto_field()
    valid: ma.auto_field()

class MetadataSchema(ma.SQLAlchemyAutoSchema):
    class Meta:
        model = Metadata

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM