Python 什么是标准的体系结构模式来集中封装ORM调用链以避免重复&;提高可维护性?

Python 什么是标准的体系结构模式来集中封装ORM调用链以避免重复&;提高可维护性?,python,database,django-models,design-patterns,architecture,Python,Database,Django Models,Design Patterns,Architecture,我的一位好同事不久前提出了这个问题,我现在公布并分享我自己的答案,不仅是为了将来参考,也是为了从社区的答案中学习 我想在应用程序中使用某种数据库层。大多数应用程序都使用ORM,因此可以在那里构建复杂的查询。如果我不想使用查询生成器,而更喜欢将其封装在函数或类中,该怎么办?例如,而不是: def-get(category_-id:int)->HttpResponse: 职位=名单( 后期对象 .filter(category\u id=category\u id) .filter(在\u处删除\

我的一位好同事不久前提出了这个问题,我现在公布并分享我自己的答案,不仅是为了将来参考,也是为了从社区的答案中学习


我想在应用程序中使用某种数据库层。大多数应用程序都使用ORM,因此可以在那里构建复杂的查询。如果我不想使用查询生成器,而更喜欢将其封装在函数或类中,该怎么办?例如,而不是:

def-get(category_-id:int)->HttpResponse:
职位=名单(
后期对象
.filter(category\u id=category\u id)
.filter(在\u处删除\u isnull=True)
.filter(在昨天发布)
)
返回HttpResponse(posts)
我想做以下几点:

def recent_posts_from_category(category_id:int)->List[Post]:
返回列表(
后期对象
.filter(category\u id=category\u id)
.filter(在\u处删除\u isnull=True)
.filter(在昨天发布)
)
def get(category_id:int)->HttpResponse:
posts=最近发布的来自类别的帖子(类别id)
返回HttpResponse(posts)
您如何称呼这种方法/模式?你会把密码放在哪里

创建名为
数据库
的模块或名称空间听起来太宽泛了。我不想将这些函数放入
utils
helpers
名称空间,因为它们显然不是实用程序

术语
Repository
适合这里吗?我不会走到封装一切(读写)的地步,使用ValueModels而不是ORM模型(ActiveRecord),其抽象目标是能够在需要时替换ORM,构建自定义
工作单元也不在范围之内


但是我正在寻找一些干练的助手,你知道,如果我需要稍微改变行为的话,为了找到所有类似的用例,我会避免搜索整个存储库。避免重复ORM调用链。

用的话来说,您感兴趣的主题称为“数据源架构模式”。那么,什么是数据源层,它的常见架构模式是什么

数据源层 我想在应用程序中使用某种数据库层。大部分 应用程序使用ORM,可以构建复杂的查询 那里如果我不想使用查询生成器而更喜欢 将其封装在函数或类中

广义地说,正如您可能已经知道的,您希望实现一个应用程序的其余部分将与之接口的;充当间接层,不仅有助于与基础架构(特定数据库或ORM框架)解耦,而且有助于消除重复。它也被称为“数据源层”

数据源体系结构模式 就实现而言,这样一个层由一组对象或如您所提到的函数组成。让我们先谈谈函数

“分层可以发生在这些级别中的任何一个。一个小程序可能只是将层的单独功能放入不同的文件中。更大的 系统可能有对应于具有许多类的名称空间的层 在每一个“-”,福勒


您如何称呼这种方法/模式?你会把电话放在哪里 密码

在您的特定示例中,函数用于包装AR对象的方法调用链,我能想到的最接近的模式是“事务脚本”。不是特定于数据源的模式,而是通用的业务逻辑封装方法;一个既不是功能性的,也不是面向对象的;而是程序性的

这些功能可能会组织在以数据封装架构层命名的模块中;不管你怎么称呼它。命名候选名称的范围可以从
datasource.py
dal.py
以及其他主观上好的名称。由于这种模式在OO代码库中并不常见,我认为您很难找到一个标准的社区接受的名称

该模式的简单性可能适用于小型代码库。然而,在处理许多查询的大型数据密集型代码库的情况下,最终出现维护和决策问题的可能性相对高于更现代和可接受的模式

此外,我个人更喜欢保持事物的一致性。如果Django附带OO模型,我会保留OO。在OO设置中这样孤立的非util函数对于将来将加入您的项目的大多数OO程序员来说是不熟悉的

现在让我们谈谈对象。在OO代码库中,这样的对象在内存中形成一个按需的“虚拟对象数据库”。这些对象通常按照属于“和更通用”模式(简单地说:单独的数据访问关注点)类别的数据源体系结构模式来实现。让我们试着去抓它们的表面


& 他们猛烈地袭击了所有社区。你知道这一切。所以,这里没什么可说的

我想进一步强调的唯一一点是,正如你所经历的那样;他们只给我们买了一些“解耦”,因为他们通常的表现力几乎总是需要一个“家”来居住,这样我们就可以避免重复并提高可维护性

一个家庭,它还将承载任何罕见的性能敏感的查询构建逻辑,这些逻辑可能不适合标准的ORM。这样的家庭将帮助我们划定一个清晰的数据访问边界

欲了解更多信息,请参阅:


术语存储库适合这里吗

很好