在开发一个索引系统文档的网站时,我遇到了一个棘手的难题,那就是在Django中跨数据库的数据“匹配”/关系。在
本地数据库的简化模型:
from django.db import models
class Document(models.Model):
name = models.CharField(max_length=200)
system_id = models.IntegerField()
...
详细信息存储在一个远程数据库中。在
^{pr2}$我的想法是,当在我的网站上创建一个新的文档条目时,相关系统的ID将存储在本地数据库中。当显示数据时,我必须使用存储的ID从远程数据库中检索系统名称和其他详细信息。在
我已经研究过foreign keys across databases,但这似乎非常广泛,我不确定是否需要关系。相反,我将文档模型/类中的一个函数可视化,该函数能够检索匹配的数据,例如通过导入自定义路由器/函数。在
我该怎么解决这个问题呢?在
请注意,我无法更改远程数据库上的任何内容,而且它是只读的。不确定是否也应该为系统创建一个模型。这两个数据库都使用PostgreSQL,但是我的印象是,它与使用哪个数据库的场景没有实际的关系。在
您是正确的,跨数据库的外键在Django-ORM中是一个问题,在某种程度上在db级别也是一个问题。在
基本上您已经有了答案:“我在文档模型/类中可视化了一个函数,它能够检索匹配的数据”
我会这样做的:
您可能认识到上面的
RemoteObject
类实现了Python的描述符协议,更多信息请参见这里:https://docs.python.org/2/howto/descriptor.html
用法示例:
^{pr2}$更进一步,您可以编写一个自定义的db路由器:
https://docs.djangoproject.com/en/dev/topics/db/multi-db/#using-routers
这将允许您通过将
System
模型的所有读取路由到适当的数据库来消除代码中的using('system_db_name')
调用。在我会使用get_system()方法。所以:
这是最简单的解决办法。一个可能的解决方案是使用PostgreSQL的外部数据包装特性。通过使用FDW,您可以从django抽象出multidb处理,并在数据库中执行它—现在您可以使用需要使用document->;system关系的查询。在
最后,如果您的用例允许的话,只需定期将系统数据复制到本地数据库就可以了。在
在django文档中multi-db (manually-selecting-a-database)
当然,您可以用您想要的任何东西替换.all()。在
^{pr2}$相关问题 更多 >
编程相关推荐