gpt4 book ai didi

python - Flask-restplus fields.Nested() 与原始 Dict (不是模型)

转载 作者:行者123 更新时间:2023-12-03 00:19:36 26 4
gpt4 key购买 nike

剧透警告:我发布了我的解决方案作为此问题的答案

我正在使用flastk-resptlus创建一个 API。我必须提供特定结构的数据,但我无法获取该数据,请参阅下面的示例:

我需要得到的是这个结构:

{
"metadata": {
"files": []
},
"result" : {
"data": [
{
"user_id": 1,
"user_name": "user_1",
"user_role": "editor"
},
{
"user_id": 2
"user_name": "user_2",
"user_role": "editor"
},
{
"user_id": 3,
"user_name": "user_3",
"user_role": "curator"
}
]
}
}

但问题来了,我无法获取 "result" : { "data": []} 的结构而不使“数据”本身成为模型。

到目前为止我尝试做的事情(但没有成功)

# define metadata model
metadata_model = api.model('MetadataModel', {
"files": fields.List(fields.String(required=False, description='')),
}
# define user model
user_model = api.model('UserModel', {
"user_id": fields.Integer(required=True, description=''),
"user_name": fields.String(required=True, description=''),
"user_role": fields.String(required=False, description='')
}

# here is where I have the problems
user_list_response = api.model('ListUserResponse', {
'metadata': fields.Nested(metadata_model),
'result' : {"data" : fields.List(fields.Nested(user_model))}
})

提示无法从 "data" 获取“架构” (因为不是定义的模型),但我不想成为一个新的api模型,只想附加一个名为“data”的键。有什么建议吗?

我尝试过并且有效,但不是我想要的(因为我错过了“数据”):

user_list_response =  api.model('ListUserResponse', {
'metadata': fields.Nested(metadata_model),
'result' : fields.List(fields.Nested(user_model))
})

我不想要data成为一个模型,因为 api 的常见结构如下:

{
"metadata": {
"files": []
},
"result" : {
"data": [
<list of objects> # here must be listed the single model
]
}
}

然后,<list of objects>可以是用户、地址、工作等等......所以我想制作一个“通用结构”,然后我可以在其中注入(inject)特定模型(UserModel、AddressModel、JobModel 等),而无需创建特殊的 data每个模型。

最佳答案

一种可能的方法是使用fields.Raw,它返回您传递的任何可序列化对象。然后,您可以定义第二个函数,它创建结果并使用 marshalmarshal 根据模型转换数据并接受名为 envelope 的附加参数。 envelope 通过给定的键包围您的建模数据并完成任务。

from flask import Flask
from flask_restplus import Api, fields, Resource, marshal

app = Flask(__name__)
api = Api()
api.init_app(app)

metadata_model = api.model("metadata", {
'file': fields.String()
})

user_model = api.model('UserModel', {
"user_id": fields.Integer(required=True, description=''),
"user_name": fields.String(required=True, description=''),
"user_role": fields.String(required=False, description='')
})

response_model = api.model("Result", {
'metadata': fields.List(fields.Nested(metadata_model)),
'result': fields.Raw()
})


@api.route("/test")
class ApiView(Resource):

@api.marshal_with(response_model)
def get(self):

data = {'metadata': {},
'result': self.get_user()}
return data


def get_user(self):
# Access database and get data
user_data = [{'user_id': 1, 'user_name': 'John', 'user_role': 'editor'},
{'user_id': 2, 'user_name': 'Sue', 'user_role': 'curator'}]

# The kwarg envelope does the trick
return marshal(user_data, user_model, envelope='data')


app.run(host='0.0.0.0', debug=True)

Response

关于python - Flask-restplus fields.Nested() 与原始 Dict (不是模型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58919366/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com