烧瓶宁静的json格式

时间:2020-01-21 20:03:15

标签: python flask flask-sqlalchemy flask-restful

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

enter image description here

我正在通过以下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格式? 任何帮助表示赞赏。

1 个答案:

答案 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