我正在Django上做一个类似erp的小项目,它包含不同的应用程序(产品,销售,采购,会计,MRP,…)。其中一些有依赖关系(例如,Sales应用程序需要Products应用程序)。
为了模块化和松散耦合,我试图保持应用程序尽可能独立。然而,如果应用程序可以在它们的依赖模型中扩展(添加新字段)表,这将是非常有用的,并且使事情变得更简单(例如,Sales将在Products范围内的一个表中添加can_be_sold
BooleanField,如果它已安装)。
这样,当用户内部选择安装应用程序时,就会在数据库中进行必要的更改,以便与依赖项正确集成。用户只安装他需要的应用程序,而不必在依赖项中先验地提供不必要或不相关的信息。
我想与依赖关系建立一对一的关系,但这个解决方案并不能说服我,因为(a)为一两个额外的字段制作这么多新表似乎不是很有效,(b)处理表单和信号将是一个麻烦(如果安装了许多应用程序并降低了整体模块化,则代码更难维护)。
继承或抽象类似乎也不合适,因为我不是试图为子产品创建模型,而是在表中的现有信息(条目)上增长或扩展。
实现这一目标的最佳方法是什么?我是否应该考虑编写自定义迁移操作?否则,有没有更好的方法?谢谢!
我建议您创建一个数据库表来保存所有可能已注册的模块和类。所以你可以在eval语句中使用它作为变量python代码。如果你有预定义的方法名,在下面的方法中,我称之为common_method。
你甚至不需要抽象类
my_evaluated_code = 'from '+mymodule_var_name + ' import ' + myclass_var_name +' as custommodule'
eval(my_evaluated_code)
custommodule.common_method()