我有一个表是数据库,类似于下面的数据。我正在尝试使用Flask-Restful创建REST API。
我正在通过以下api使用flask-restful和flask-sqlalchemy。
/ project / 1
@classmethod
def find_by_project_no(cls,proj_no):
cls.query.filter_by(project_no = proj_no).all()
结果为[<automap.bla.bla>,<>,<>...]
我需要将结果转换成
{
'project': [{
'country': 'USA',
'category': [{
'Beverages': [{
'product': 'Milk',
'count': 2
}, {
'product': 'Juice',
'count': 5
}
]
}, {
'Snacks': [{
'product': 'Potato Chips',
'count': 2
}
]
}, {
'Oils': [{
'product': 'Canola',
'count': 5
}, {
'product': 'Olive',
'count': 8
}
]
}
]
}, {
'country': 'CAN',
'category': [{
'Beverages': [{
'product': 'Milk',
'count': 7
}, {
'product': 'Juice',
'count': 8
}
]
}, {
'Snacks': [{
'product': 'Potato Chips',
'count': 8
}
]
}, {
'Oils': [{
'product': 'Canola',
'count': 3
}, {
'product': 'Olive',
'count': 4
}
]
}
]
}
]
}
如何获取所需的json格式? 任何帮助表示赞赏。
答案 0 :(得分:0)
我认为您在问如何将Flask-SQLAlchemy模型转换为JSON以作为对请求的响应进行发送。我会详细说明:
我通常会实现一个类,我的所有模型都从该类继承而来,该类提供了必要的基本功能。这是一个示例(请注意,有百万种方法可以执行此操作,这只是我使用的快速灵活的方法):
from flask.json import JSONEncoder
from sqlalchemy.orm.query import Query
DEFAULT_IGNORE_ATTRS = {'base_obj_members', 'metadata'}.union(dir(type('dummy', (object,), {})))
class CustomEncoder(JSONEncoder):
def default(self, obj):
if isinstance(obj, BaseModel):
return obj.to_json()
elif isinstance(obj, Query):
return obj.all()
return super(CustomEncoder, self).default(obj)
class BaseModel():
def to_json(self, ignore_keys=list()):
ignore_keys = DEFAULT_IGNORE_ATTRS.union(ignore_keys)
obj = dict()
for k in filter(lambda k: k not in ignore_keys and k[0] != '_', dir(self)):
v = getattr(self, k)
if not (isinstance(v, Query) or callable(v)):
obj[k] = v
return obj
app.json_encoder = CustomEncoder
这是使用方法:
class SomeModel(db.Model, BaseModel):
name = db.String()
@property
def some_attr_that_is_not_a_col(self):
return 'heyooo'
BaseModel
会为您提供的功能是为所有模型提供功能to_json
,该功能实际上只是将对象变成字典,然后您可以从Flask进行响应。因此,在您的示例中,您可以在该列表中的每个项目上调用to_json
,以将它们全部转换为JSON对象。
这很好,因为它将获取表中每一列的值,还可以获取您定义的任何属性,忽略函数和“隐藏”属性(即以“ _”开头的内容),并允许您添加自定义属性将被忽略。
这种方法非常适合入门,但是效率很低,如果您的API服务于很多请求,则会使您慢下来。因此,对于任何寻求更快的序列化模型对象方法的人,我不推荐marshmallow。