Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python,初学者';这是个问题!存储库还是对象自身持久化?_Python - Fatal编程技术网

Python,初学者';这是个问题!存储库还是对象自身持久化?

Python,初学者';这是个问题!存储库还是对象自身持久化?,python,Python,我是一名经验丰富的.Net开发人员,正在尝试编写一些Python代码。在我参与的一个项目中,我们有一个服务层,它是一组抽象出功能的类,还有一个django web应用程序,它使用这些进程内服务(只是类) 我已经创建了一个存储库层,并确保与数据库的所有交互都是通过这个存储库通过服务层进行的。我们有一个面向文档的数据库,因此我们没有通常的对象关系。 在最近的一次代码审查中,一位据说熟悉python的开发人员回避了这一点,并评论说这不是python的工作方式。他指出,python开发人员习惯于在对象实

我是一名经验丰富的.Net开发人员,正在尝试编写一些Python代码。在我参与的一个项目中,我们有一个服务层,它是一组抽象出功能的类,还有一个django web应用程序,它使用这些进程内服务(只是类)

我已经创建了一个存储库层,并确保与数据库的所有交互都是通过这个存储库通过服务层进行的。我们有一个面向文档的数据库,因此我们没有通常的对象关系。 在最近的一次代码审查中,一位据说熟悉python的开发人员回避了这一点,并评论说这不是python的工作方式。他指出,python开发人员习惯于在对象实例本身上使用save和delete方法(并且不经常使用存储库模式),这会让希望为我们的OSS项目做出贡献的python开发人员感到困惑。Python开发人员,您的观点是什么?你会感到困惑吗


编辑:这不是django代码,而是django应用程序调用的代码(它是进程内服务层)

据我记忆所及,django的模型包括
save()
delete()
方法,因此您可以专门处理对象,而不是与数据库连接对象交互。我不知道它是否立即成为Python的一种工作方式,但我很确定它是一种普遍的Django模式


如果有人告诉我“这是Django代码”,但代码与Django的工作方式不同,那可能会令人困惑。

也许这是Django模式,但绝对不是Python模式。
也就是说,如果模块的目标受众是Django开发人员,我建议您尽可能遵循Django的理念及其相关模式。

Django的ORM提供了对象上的
save()
delete()
方法。另一方面,SQLAlchemy有一个所谓的
会话
,您可以在其中添加或删除对象

这两种方法都很受欢迎,所以我认为这两种方法在受欢迎程度上大致相同。然而,在Django应用程序的上下文中,使用Django约定可能更可取,除非您有充分的理由不这样做。

不要重复您自己的话。如果数据库中存储的所有数据都要通过django访问(例如,它们在django models.py中定义);有一个django ORM,它已经被设计为安全(无SQL注入)并通过
save()
delete()
轻松访问数据库。还有一些有用的包装函数来创建事务(例如,
@transaction.commit_on_success
将操作分组在一起。您可以在运行的django web应用程序之外的python脚本中使用ORM。例如,从django shell(
/manage shell
)创建或运行脚本

我绝对同意使用另一个存储库层会造成混乱,并可能导致使用您的存储库的人遇到重大问题。例如,有时您的模型验证超出了数据库验证的范围,如果您将其保存在django之外,验证将永远不会运行。或者,每次保存特定的模型时,都会出现额外的行为如果未调用
save()
,则会跳过的ld发生(如创建互补对象;或生成任务),因此永远不会生成前保存后保存信号

假设您说过这是一个面向文档的数据库(例如,mongdb/couchdb),而AFAIK django不支持这种NoSQL数据库,那么请忽略我所说的