【发布时间】:2020-04-23 21:37:15
【问题描述】:
我正在使用 Flask 构建 API,但在为嵌套结构和 Marshmallow 构建模型时遇到了多个错误。无论我做什么,似乎我都无法到达任何地方。
输入数据是一个嵌套的 JSON。我需要将信息存储在数据库(sqlite)中并根据需要进行查询。我猜我创建的模型看起来还不错。我对模式有一些疑问。不确定它们是否正确或正确使用。有关使用诸如此类的嵌套结构的信息并不多。我看到很多基本的东西,包括付费教程,但结构更复杂的却不多:
{
"bessAssets": [{
"designation": "bess3",
"status": true,
"vNom": 0,
"eNom": 0,
"maxSoc": 90,
"minSoc": 10,
"testData": {
"vNomD": [{
"cRate": 0,
"vAvg": 0,
"trial": 1
}],
"vNomC": [{
"cRate": 0,
"vAvg": 0,
"trial": 1
}]
}
}]
}
我在上次尝试中所做的工作是这样的:
from marshmallow import Schema, fields
from marshmallow_sqlalchemy import SQLAlchemySchema, auto_field, SQLAlchemyAutoSchema
from marshmallow import EXCLUDE
from flask_sqlalchemy import SQLAlchemy
from flask import Flask
import os
import json
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
class BessAsset(db.Model):
__tablename__ = 'bess_asset'
designation = db.Column(db.String(70), primary_key=True)
status = db.Column(db.Boolean)
vNom = db.Column(db.Float)
eNom = db.Column(db.Float)
maxSoc = db.Column(db.Float)
minSoc = db.Column(db.Float)
class TestData(db.Model):
__tablename__ = 'test_data'
test_data_id = db.Column(db.Integer, primary_key=True)
bess_asset_designation = db.Column(db.String, db.ForeignKey('bess_asset.designation'))
bess_asset = db.relationship('BessAsset', backref=db.backref("testData"), cascade='all')
class VnomD(db.Model):
__tablename__ = 'vnom_d'
vnom_id = db.Column(db.Integer, primary_key=True)
cRate = db.Column(db.Float)
vAvg = db.Column(db.Float)
trial = db.Column(db.Integer)
test_data_id = db.Column(db.Integer, db.ForeignKey('test_data.test_data_id'))
test_data = db.relationship('TestData', backref=db.backref("vNomD"), cascade='all')
class VnomC(db.Model):
__tablename__ = 'vnom_c'
vnom_id = db.Column(db.Integer, primary_key=True)
cRate = db.Column(db.Float)
vAvg = db.Column(db.Float)
trial = db.Column(db.Integer)
test_data_id = db.Column(db.Integer, db.ForeignKey('test_data.test_data_id'))
test_data = db.relationship('TestData', backref=db.backref("vNomC"), cascade='all')
class VnomDSchema(SQLAlchemyAutoSchema):
class Meta:
model = VnomD
exclude = ('vnom_id',)
include_fk = True
# load_instance = True
class VnomCSchema(SQLAlchemyAutoSchema):
class Meta:
model = VnomC
exclude = ('vnom_id',)
include_fk = True
# load_instance = True
class TestDataSchema(SQLAlchemyAutoSchema):
vnom_c = fields.Nested(VnomCSchema, many=True)
vnom_d = fields.Nested(VnomDSchema, many=True)
class Meta:
model = TestData
unknown = EXCLUDE
include_relationships = True
class BessAssetSchema(SQLAlchemyAutoSchema):
testData = fields.Nested(TestDataSchema, )
class Meta:
model = BessAsset
unknown = EXCLUDE
include_relationships = True
# load_instance = True
db.create_all()
with open(os.path.join('examples', 'structures', 'assets.json')) as f:
json_file = json.load(f)
bess_asset_schema = BessAssetSchema()
vnomd_schema = VnomDSchema()
vnomc_schema = VnomCSchema()
for b_asset in json_file['bessAssets']:
bess_structure = (bess_asset_schema.load(b_asset))
bess_asset = BessAsset(**bess_structure)
test_data = TestData(bess_asset=bess_asset)
db.session.add(bess_asset)
for value in b_asset['testData']['vNomD']:
vnom_d_structure = (vnomd_schema.load(value))
vnom_d = VnomD(**vnom_d_structure, test_data=test_data)
db.session.add(vnom_d)
for value in b_asset['testData']['vNomC']:
vnom_c_structure = (vnomc_schema.load(value))
vnom_c = VnomC(**vnom_c_structure, test_data=test_data)
db.session.add(vnom_c)
db.session.commit()
bess_assets = BessAsset.query.all()
dump_data = bess_asset_schema.dump(bess_assets)
print(dump_data)
错误似乎来自这一行(AttributeError: 'NoneType' object has no attribute 'query'):
for b_asset in json_file['bessAssets']:
bess_structure = (bess_asset_schema.load(b_asset))
您能帮我弄清楚如何正确存储该结构并将其输出给用户吗?
谢谢!
【问题讨论】:
标签: python flask flask-sqlalchemy marshalling marshmallow