【问题标题】:Flask restful json formating [duplicate]烧瓶restful json格式[重复]
【发布时间】:2020-05-07 22:41:44
【问题描述】:

我有一个表是类似于以下数据的数据库。我正在尝试使用 Flask-Restful 创建一个 REST API。

我正在使用 flask-restful 和 flask-sqlalchemy 以及下面的 api。

/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 格式? 任何帮助表示赞赏。

【问题讨论】:

  • @roganjosh 有人可能知道 sqlalchemy 查询的返回值是什么。如果你不知道那很好。你希望我上传整个项目和数据库?
  • 当他们看不到模型时,没有人可以知道 SQLA 查询的返回值是什么。您已经给出了数据框的屏幕截图(这不是您正在使用的并且缺少字段)。我没有建议整个数据库,我建议minimal reproducible example

标签: python flask flask-sqlalchemy flask-restful


【解决方案1】:

我认为您是在询问如何将您的 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

【讨论】:

    猜你喜欢
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 2017-08-24
    • 2016-08-12
    • 1970-01-01
    相关资源
    最近更新 更多