模仿 JAVA DTO 概念的实现的包 PyDto

本贴最后更新于 1330 天前,其中的信息可能已经时移俗易

PyDto 实现记录

实现背景

因为 python 语言的特性,在业务数据返回方面,没有类似 JAVA DTO 的概念实现主体,苦于目前返回的数据结构都需要自己写代码整合,所以需要模仿 JAVA DTO 的概念写一个工具包,方便定义返回结构体。

诉求

例如在返回一个用户数据的时候,python 的 sqlalchemy 或者某一个类直接返回所有的结构数据,甚至会带上 token 等敏感数据,这时候通常会在返回前使用代码拼装整合,变动结构也需要变动代码。理解 JAVA DTO 概念后想到是否有类似的包,可以在数据层与业务层之间进行拦截,根据定义好的结构直接返回相应数据结构。

思路

如果要方便使用,肯定不能在 sqlalchemy 或者字典或者对象本身进行操作,需要进行隔离,那么选用的方式就是类继承的形式,将数据解析以及自动拼装的方法封装进去。

字典与类的形式相对简单,容易解析多层结构,但是遇到 sqlalchemy 需要进行调用返回链表数据结构,所以需要特殊的方式进行处理。

        if type(obj) != dict and not hasattr(obj, "__iter__"):
            for key_name, k_type in obj_dict_class.items():
                if obj.__getattribute__(key_name):
                    if k_type.__dict__.get("__annotations__") and self.data_mode == "sqlalchemy":
                        result[key_name] = self.MapSchema(obj.__getattribute__(key_name),
                                                          k_type.__dict__.get("__annotations__"))
                    else:
                        result[key_name] = self.todict(obj.__getattribute__(key_name))

需要判断链表后的数据是单结构还是迭代对象,所以在这里进行判断,并根据数据体结构,传入到下层结构中。

项目

PyDto 实现

这里是实现的源码,整体思路可以到代码中详细查看

  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    535 引用 • 672 回帖
  • DTO
    2 引用 • 15 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • YakunSun 1 评论

    类似的可以使用 Pydantic

    确实目前 Pydantic 和 Typing 能满足大部分需求。按照需求字段类型截取还有部分未满足,倒是可以使用 fastApi 的 model 处理 sqlalchemy 数据截取问题
    Gaoshengyue