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 项目中的其他应用程序?

迁移回滚期间无法从其他应用导入 Django 模型

Django - 使用给定的 sql 转储创建其他模型并填充数据 [重复]

如何正确扩展 django 用户模型

django更改管理视图(无模型)

应用程序(或模型)未显示在 Django Admin 中