Django 后端设计建议

Django Back-End Design Advice

我有一个在工作中使用的工具,它是用 python 编写的,我想将其移植到 Django 框架中,以便更加无缝地编写基于 Web 的管理界面。我已经阅读了 django 教程,并且对如何使用您自己的数据库(或多个数据库)编写基本的 django 应用程序有了非常扎实的理解。

我在这个特定项目中遇到的困境 运行 是我引用了多个数据源:

  1. 实际上可能是也可能不是 SQL 数据库,有些没有作为 django 后端的任何实现(例如 LDAP 和 Google Admin SDK)。
  2. 第三方数据源的总体 "model" 可能会更改,恕不另行通知,我对此无法控制...尽管我将访问的 'model' 部分可能会永不改变。

所以我的问题是:我是否应该将这些外部数据源视为 django 'model'?或者我最好只编写一些单独的接口 类 来处理这些数据源?

我可以看到编写新的 'db engine' 来处理与这些数据源的通信的可能性,因此从实际的应用程序实现中我可以调用所有常用方法,就像我查询任何数据库一样。理想情况下,我正在编写的应用程序的核心不需要关心它连接到的每个数据源的实现细节——我想让它尽可能地可插拔,这样将来新数据源类型的实现不会涉及太多,如果对核心代码的任何修改。

我想知道这是否是 'accepted' 的实现方式 - 或者,对于像这样的自定义情况,您是否可以使用 django 后端并实现您自己的自定义解决方案用于从这些数据源中查询信息。

我希望这个问题足够清楚...如果没有,请向我询问您需要的任何细节。谢谢!

1) 也许你应该考虑 Flask 网络框架,它不像 Django 那样依赖于特定的 ORM。所以您没有义务将您的数据放入 Django ORM 模型中。

2) 您可以将 Django 与一些自定义数据查询和操作工具一起使用,这完全可以。但是你应该知道,Django 生态系统的主要部分是与 Django ORM 绑定的,如果你放弃它,它就无法工作。

3) 注意 Django 模型中的 managed=False 选项。它允许您拥有一个不受 syncdbmigrate 等命令管理的模型。它基本上意味着,底层 table 不在你的控制之下,Django 不应该改变 table 并接受它 "as is".

所以我正在考虑这个问题,我想到的一种可能性是构建由 Django 支持的数据库(在我的例子中是 mysql),代表我对这些数据感兴趣的数据来源。

然后我可以覆盖查询 from/save 更改为 mysql 模型的模型方法,以调用外部 python class 我写的直接与之交互数据源和相应的 mysql 数据库。

因此,例如,在查询调用中,我可以重写 django 方法来执行此操作,并在调用 super 之前添加一个操作来检查 mysql 记录是否为 "stale" - 如果是, 在继续之前请求更新它们。

在更新操作中,我可以追加(post-update to mysql table),请求外部 class 更新外部源的操作.

这是一种迂回的方式,但它确实允许我将应用程序本身全部保留在 django 框架中,如果将来能够很好地实现提供直接后端接口的模块对于这些来源,我可以很容易地用直接接口替换解决方法。

想法?批评?