Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.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_Orm_Sqlalchemy_Separation Of Concerns - Fatal编程技术网

Python 分离业务逻辑和模型

Python 分离业务逻辑和模型,python,orm,sqlalchemy,separation-of-concerns,Python,Orm,Sqlalchemy,Separation Of Concerns,我有一个问题困扰了我一段时间。乍一看,这似乎是一个相当基本的问题,但似乎没有一个明确的答案。我提出这个问题的基础是一个Python项目,它通过SQLAlchemy使用PostgreSQL,但使用的特定语言和工具并不重要 基本问题是,在使用ORM时,逻辑放在哪里?更具体地说,映射类的方法应该包含哪些逻辑 似乎存在一些明确的情况,例如,属性的基本验证,如最小长度或某个电子邮件地址是否应属于ORM层(甚至数据库本身) 下面是一个简单的具体示例,假设我们正在存储用户对象,用户有一个电子邮件地址(这是他们

我有一个问题困扰了我一段时间。乍一看,这似乎是一个相当基本的问题,但似乎没有一个明确的答案。我提出这个问题的基础是一个Python项目,它通过SQLAlchemy使用PostgreSQL,但使用的特定语言和工具并不重要

基本问题是,在使用ORM时,逻辑放在哪里?更具体地说,映射类的方法应该包含哪些逻辑

似乎存在一些明确的情况,例如,属性的基本验证,如最小长度或某个电子邮件地址是否应属于ORM层(甚至数据库本身)

下面是一个简单的具体示例,假设我们正在存储用户对象,用户有一个电子邮件地址(这是他们的唯一id)、一个密码和一个激活id。当创建一个帐户时,会将一个激活id分配并邮寄给用户,然后用户使用该id设置密码

让我们看几个场景:

  • 用户创建一个帐户
  • 用户激活帐户(即设置密码)
因此,当用户创建帐户时,我们需要运行一些基本验证:

  • 电子邮件地址正确=>ORM
  • 电子邮件地址唯一=>ORM或数据库(唯一约束)
  • 设置一个随机激活id=>ORM
当用户激活她的帐户时,我遇到了问题。我希望验证提供的密码(例如,足够长?足够位数?),但模型应使用某种哈希或加密算法存储密码。似乎有两种选择:

1:检查激活id和模型外的密码有效性,对密码进行哈希,然后将User.password设置为哈希,将User.activation id设置为null(以表示活动帐户)

2:创建一个User.activate(activation\u id,password)方法,该方法验证所有内容,并相应地设置User.password和User.activation\u id属性

3:混合选项,执行选项1,但在设置密码时设置某种类型的钩子或事件激活\u id=null(如果我们假设可以设置激活id或密码,则此钩子满足模型的基本一致性属性)


我在互联网上搜索过,有一些来源谈论这个问题(包括一些SO问题),但没有一个真正回答这个问题。

MVC中的模型层包含域业务逻辑。我怀疑您出于某种原因假设“模型”是类/对象。我认为有两个极端:试图将所有逻辑塞进ORM映射的类中,或者只保留ORM映射的类的数据并将逻辑放在其他地方。我的结论是:不管你把逻辑放在哪里,最终都会变得一团糟。“业务逻辑”放在“持久性逻辑”中,即存储抽象中(最佳解决方案是cusomt,但一些新手更喜欢ORM magic),域对象和存储抽象之间的交互称为*“应用程序逻辑”,它存在于服务中。这三个组组合在一起构成了模型层。问题是人们看着Rails,认为它是MVC。Rails不是MVC。模仿它的框架也不是。“最佳解决方案是。。。".. 引用?我投票结束这个问题,因为我认为没有任何方法可以客观地回答这个问题。也许这更适合。@tereško如果你对你描述的模型层有一个好的参考URL,我会感兴趣的。