在flask restful plus中用变量键调集字典。

问题描述 投票:7回答:1

我正在使用flask-restful构建一个API。我也在使用flask-resfulplus来生成swagger文档。我想返回一个项目的字典,其中的key会根据项目的不同而不同。我的模型是这样的。

item = api.model('Item',{
            'item':fields.Integer()}) <- This is wrong


ItemModel = api.model('ItemsList', {
        '_header': fields.Nested(_header),
        'items':fields.Nested(item)
})

请注意,我试过一些不同的方法,但似乎都没有用,这只是最新的交互方式。

而我正在寻找的响应是这样的。

{
        '_header':{} <-This works fine
        'items': {
         'item1':5,
         'item2':2
         }
    }

item字典中的item会有一个不同的key,而count作为值。

我试过将 item 字段设置为 field.Raw(),效果很好,但是在 swagger 文档中却没有显示出来。

请注意,我不想返回一个字典列表,我已经在工作了。

谢谢,谢谢

flask marshalling flask-restful flask-restplus
1个回答
0
投票

有时你有自己的自定义格式需求。你可以将 fields.Raw类子类化,并实现format函数。当一个属性存储了多条信息时,这一点特别有用。例如,一个位字段,它的各个位代表不同的值。你可以使用field将一个属性复用为多个输出值。

如果您不知道您要取消标记的字段的名称,您可以使用通配符。

>>> from flask_restplus import fields, marshal
>>> import json
>>>
>>> wild = fields.Wildcard(fields.String)
>>> wildcard_fields = {'*': wild}
>>> data = {'John': 12, 'bob': 42, 'Jane': '68'}
>>> json.dumps(marshal(data, wildcard_fields))
>>> '{"Jane": "68", "bob": "42", "John": "12"}'

您给您的通配符起的名字就像一个真正的 glob,如下所示。

>>> from flask_restplus import fields, marshal
>>> import json
>>>
>>> wild = fields.Wildcard(fields.String)
>>> wildcard_fields = {'j*': wild}
>>> data = {'John': 12, 'bob': 42, 'Jane': '68'}
>>> json.dumps(marshal(data, wildcard_fields))
>>> '{"Jane": "68", "John": "12"}'

注释重要的是,你要在模型之外定义你的通配符。(也就是说,你不能像这样使用:res_fields = {'。': fields.Wildcard(field.String)})*。 因为它必须是有状态的,以跟踪它已经处理了哪些字段。

© www.soinside.com 2019 - 2024. All rights reserved.