代码之家  ›  专栏  ›  技术社区  ›  Simon

python中的MVC模型结构

  •  2
  • Simon  · 技术社区  · 16 年前

    在我的python应用程序中,在MVC模式的模型部分构造类时遇到了问题。不管我怎么做,我都会不断地进入循环进口。以下是我的资料:

    型号/初始化

    • 应该保留所有模型类名,因此 我可以做“从模型导入用户” 例如来自控制器或装置 测试用例

    模型/数据库.py

    • 保留数据库类
    • 需要导入所有模型类才能执行ORM
    • 初始化应该在第一个模块导入时执行,即没有额外的init调用或实例化(数据库类上的所有方法都是@class methods)

    模型/U.P.Py

    • 包含用户模型类
    • 需要访问数据库类才能进行查询
    • 应继承所有模型类通用的基类以共享功能(数据库持久性方法、参数验证代码等)

    我还没有看到一个使用MVC的真实世界的python应用程序,所以我的方法很可能是非pythonic(还有可能是语言不可知论的混乱…)—有关于如何解决这个问题的建议吗?

    谢谢,西蒙

    3 回复  |  直到 16 年前
        1
  •  6
  •   davidavr    16 年前

    您的规格不一致。您说database.py需要导入所有模型类来执行ORM,但是您说用户类需要访问数据库来执行查询。

    把这些看作是API的层。数据库类为一些物理持久层(如db-api 2.0)提供了一个API(可能是面向对象的)。模型类和用户一样,使用数据库层来加载和保存它们的状态。没有理由让database.py类导入所有模型类,事实上,您不希望这样做,因为每次创建新的模型类时都必须修改database.py,这是一种代码味道。

        2
  •  3
  •   S.Lott    16 年前

    一般来说,我们把它们放在一个文件中。这不是Java或C++。

    从一个文件开始,直到您对python有更多的经验。除非你的文件太多,否则它会很好用的。

    例如,Django鼓励这种风格,所以复制他们的成功公式。模型的一个模块。每个应用程序的一个模块;每个应用程序导入一个公共模型。

    你的数据库和超类的东西可以在你的 __init__.py 文件,因为它适用于整个包。这可能会减少一些循环。

        3
  •  1
  •   Joe Skora    16 年前

    我认为你有一个问题需要澄清。循环引用通常是由于未能实现关注点分离而导致的。在我看来,数据库和模型模块不应该彼此了解太多,而应该使用API。在这种情况下,数据库不应该直接引用任何特定的模型类,而是提供模型类需要运行的功能。反过来,模型应该得到一个数据库引用(注入或请求),它将使用该引用来查询和保持自身。