0

我有一个使用 SQLalchemy 作为数据库的 FLASK 应用程序。

模型都在models.py中,我在大多数模型类的默认 ORM 属性和方法中添加了几个属性和方法。例如; 我的“合同”模型有一个额外的属性 contract.first_possible_termination 返回一个日期。

问题是这个属性访问了一个实用程序模块,该模块具有计算日期范围的功能。并且该功能需要使用存储在数据库中的“配置”表中的不同配置选项。

所以实用程序模块需要再次使用 ORM 模型来访问配置表,因此我们有一个循环导入:

ImportError: cannot import name Configuration

我想知道在这里避免循环导入的标准方法是什么。我想更多的人会遇到这种情况,因为有人会在模型中添加方法和属性。

编辑,请注意:
我认为植物人的回答通常是最好的方法,因为它促进了 SoC,但在我的具体情况下,我正在使用一个遗留数据库,该数据库具有影响分布在不同表中的不同表中的业务规则的值数据库。
我添加到模型中的许多功能将以某种方式依赖于这些值/业务规则,因此如果不进行大量重构并传递大量额外的外部数据,我将无法避免在这些函数中访问数据库我的辅助函数的值。

我只能接受一个答案,但两者都是有效的,所以对两者都投赞成票,但 Blubber 的答案是我目前的个人解决方案。
感谢 Blubber 和 Plantian。

4

2 回答 2

3

您可以在函数内部而不是在模块顶部导入模块,模块只导入一次,因此这不会造成性能问题。

您还可以尝试将配置模块导入移动到 util 模块的底部。

于 2013-07-01T11:22:55.887 回答
1

另一种选择是将配置作为参数传递给实用程序函数。最好不要让您的实用程序直接依赖于模型。IE。

def get_range (start_at, strategy):
    pass

策略由调用者确定(来自配置表)。也许你的 util 函数的代码片段会更容易构建。

于 2013-07-02T23:14:13.993 回答