Python中的MVC模型结构

3 投票
3 回答
4072 浏览
提问于 2025-04-11 09:35

我在我的Python应用程序中,按照MVC模式构建模型部分的类时遇到了问题。无论我怎么调整,都会碰到循环导入的问题。以下是我的结构:

Model/__init__.py

  • 这个文件应该包含所有模型类的名称,这样我就可以在控制器或单元测试中使用“from Model import User”这样的语句。

Model/Database.py

  • 这个文件包含数据库类。
  • 需要导入所有模型类,以便进行对象关系映射(ORM)。
  • 初始化应该在第一次导入模块时完成,也就是说,不应该有额外的初始化调用或实例化(数据库类中的所有方法都是类方法)。

Model/User.py

  • 这个文件包含用户模型类。
  • 需要访问数据库类来执行查询。
  • 应该从所有模型类共有的基类继承,以共享功能(例如数据库持久化方法、参数验证代码等)。

我还没见过真正的Python应用程序使用MVC模式,所以我的做法可能不太符合Python的风格(而且可能在语言上也有些混乱……)- 有没有什么建议可以解决这个问题?

谢谢,西蒙

3 个回答

1

我觉得你有一个问题需要理清。循环引用通常是因为没有做到关注点分离。我的看法是,数据库和模型模块之间不应该了解太多彼此的事情,而是应该通过一个API来进行交互。在这种情况下,数据库不应该直接引用任何特定的模型类,而是应该提供模型类所需的功能。模型则应该获取一个数据库的引用(可以是注入的或请求的),然后用这个引用来查询和保存自己。

3

一般来说,我们会把所有内容放在一个文件里。这可不是Java或C++那样的语言。

刚开始学Python的时候,先用一个文件就好,等你有了更多经验再说。除非你的文件特别大,否则这样做完全没问题。

比如,Django这个框架就提倡这种写法,所以可以借鉴他们的成功经验。一个模块用来定义模型,每个应用程序都有一个模块;每个应用程序都可以引用一个公共的模型。

你的数据库和父类相关的内容可以放在__init__.py文件里,因为这些内容是适用于整个包的。这样可以减少一些循环引用的问题。

7

你的说明里有点矛盾。你说Database.py需要导入所有的模型类来进行ORM(对象关系映射),但你又说User类需要访问数据库来进行查询。

可以把这些看作是API的不同层次。Database类提供了一个API(可能是面向对象的),用来和一些实际的数据存储层(比如DB-API 2.0)进行交互。模型类,比如User,使用Database层来加载和保存它们的状态。实际上,Database.py类不需要导入所有的模型类,甚至你不想这样做,因为每次你创建一个新的模型类时,都得修改Database.py,这样的做法是不太好的。

撰写回答