Django 管理后台使用 RESTful API 与数据库

13 投票
1 回答
5472 浏览
提问于 2025-04-17 11:06

我知道这个问题有点奇怪,但请耐心听我说。我们为一款iPhone应用开发了一个基于Python的RESTful平台。这个平台的网页版本是用Django搭建的,同样也在使用这个API。我们觉得利用Django自带的控制面板功能来管理数据是个不错的主意。

这本身不是问题。问题在于,大家都认为把管理中心做成一个在RESTful平台上运行的客户端是最好的选择。

所以,我想问的是,有没有办法调整Django的模型层,直接访问我们的API,而不是直接和数据库沟通?模型层就像客户端一样,负责在管理中心和API之间传递请求和响应。

我相信这是可行的,但我不太确定该从哪里开始。有什么建议吗?

1 个回答

3

我记得我曾经考虑过做这样的事情。那时候,我创建了一个自定义的管理器,使用了一个自定义的查询集。我重写了一些方法,比如 _filter_or_exclude()count()exists()select_related() 等等,还添加了一些属性。结果不到一周就变得一团糟,可能再也没机会正常工作了。所以我立刻停止了一切,找到了一个更合适的解决方案。

如果让我再做一次,我会花很长时间考虑其他的选择。如果真的觉得这是最好的办法,我可能会创建一个自定义的数据库后端。这个后端不是把Django的ORM查询转换成SQL查询,而是把它们转换成HTTP请求。

为了做到这一点,我觉得最好的起点是熟悉一下 Django关于数据库后端的源代码

我还认为在开始这样的开发之前,有一些重要的事情需要考虑:

  • 这个API能处理任何Django ORM请求吗?换句话说:任何Django ORM查询都能转换成API请求吗?
  • 如果不能,是否可以安全地忽略那些“无法转换”的查询?比如,ORDER BY子句可能可以安全忽略,而GROUP BY子句则很可能不能被忽略。
  • 如果有些查询既不能转换也不能忽略,是否可以合理地模拟它们?例如,如果你的API不支持COUNT()操作,你可以通过获取所有数据并在Python中用len()来计数,但这样合理吗?
  • 如果还有一些查询你无法处理(这很可能会发生):所有“常见”的查询(在这种情况下,所有可能被Django Admin使用的查询)是否都能覆盖?如果发现了未覆盖的情况,或者在Django的未来版本中引入了新情况,是否能升级API?

根据使用场景,可能还有很多其他需要考虑的因素,比如:

  • 数据的完整性
  • 事务的支持
  • 查询的时效性,可能会比查询本地(甚至远程)数据库的时间要长得多。

撰写回答