Django:扩展其他应用程序的模型
Posted
技术标签:
【中文标题】Django:扩展其他应用程序的模型【英文标题】:Django: extending models of other apps 【发布时间】:2017-02-08 12:04:39 【问题描述】:我正在 Django 上开发类似 ERP 的小型项目,其中包含不同的应用程序(产品、销售、采购、会计、MRP ......)。其中一些具有依赖关系(例如,销售应用需要产品应用)。
为了模块化和松耦合,我试图让应用程序尽可能独立。但是,如果应用程序可以在其依赖项的模型中扩展(添加新字段)表(例如,Sales 将在其中一个表中添加 can_be_sold
BooleanField产品(如果已安装)。
这样,当用户在内部选择安装应用程序时,会在数据库中进行所需的更改,以使其与依赖项正确集成。用户只安装他需要的应用程序,而不必在依赖项中提供不必要或不相关的信息。
我曾想过与依赖项建立一对一的关系,但这个解决方案并不能说服我,因为 (a) 为一两个额外字段创建这么多新表似乎效率不高, (b) 使用表单和信号会很麻烦(如果安装了许多应用程序并降低整体模块化,则使代码更难维护)。
继承或抽象类似乎也不合适,因为我不是试图为子产品创建模型,而是在表中的现有信息(条目)上增长或扩展。
实现这一目标的最佳方法是什么?我应该考虑编写自定义迁移操作吗?否则,有更好的方法吗?谢谢!
【问题讨论】:
您是否达到了您的要求?其实我对你的方法有点兴趣(如果你找到了) 【参考方案1】:我建议你创建一个数据库表来保存所有可能注册的模块和类。 因此您可以将其用作 eval 语句中的变量 python 代码。 如果您有预定义的方法名称,在下面的这种方法中,我将其称为 common_method。
你甚至不需要抽象类
my_evaluated_code = 'from '+mymodule_var_name + ' import ' + myclass_var_name +' as custommodule'
eval(my_evaluated_code)
custommodule.common_method()
【讨论】:
谢谢,但这对在现有应用的表格中添加新字段有何帮助? 您可以根据生成的代码预测继承人的存在,存储在数据库中。因此,如果您没有文件,您的代码将永远不会中断以上是关于Django:扩展其他应用程序的模型的主要内容,如果未能解决你的问题,请参考以下文章
如何使应用程序模型可用于 django 项目中的其他应用程序?