静态json格式化

2024-05-15 06:16:06 发布

您现在位置:Python中文网/ 问答频道 /正文

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

enter image description here

我正在使用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格式? 感谢您的帮助


Tags: noprojectflaskbycountproductcountryjuice
1条回答
网友
1楼 · 发布于 2024-05-15 06:16:06

我认为您正在询问如何将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对象

这很好,因为它将获取表中每一列的值,还将获取您定义的任何属性,忽略函数和“隐藏”属性(即,具有前导“30;”)并允许您添加要忽略的自定义属性

这种方法非常适合入门,但效率非常低,如果API服务于大量请求,则会降低速度。因此,对于那些寻找序列化模型对象的更快方法的人来说,我推荐的marshmallow远远不够

相关问题 更多 >

    热门问题