Django 管理后台使用 RESTful API 与数据库
我知道这个问题有点奇怪,但请耐心听我说。我们为一款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?
根据使用场景,可能还有很多其他需要考虑的因素,比如:
- 数据的完整性
- 事务的支持
- 查询的时效性,可能会比查询本地(甚至远程)数据库的时间要长得多。