我的问题在2013年的某个时候有所回答here。但是如果有的话,我正在寻找更强大和最新的解决方案。
我有一个Django应用程序app1
,我希望将Django中的数据与其他每天不断更新的数据库联系起来。例如:在app1
中,我有模型model
,用户必须从sap输入销售订单,并从salesforce输入相应的商机编号。我有工具将数据从sap转储到sapdb
,将salesforce转储到salesforcedb
。
app1
中的模型如下:
class SalesOrderMapping(models.Model):
sales_order = models.CharField("Sales Order #", max_length=10, primary_key=True)
opportunity_number = models.CharField("Opportunity Number", max_length=30)
class Meta:
verbose_name_plural = "Sales Order / Opportunity Mapping"
ordering = ('sales_order', 'opportunity_number')
def __str__(self):
return self.sales_order
因为你可以看到在上面的模型中,我有opportunity_number,我希望用户输入sales_order
而不是输入opportunity_number
它可以是自动完成文本框(理想情况下)或丢弃由salesforcedb
中的表填充。到目前为止,我已经能够在settings.py中描述数据库。有人能指出我正确的方向吗?
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'djangoportal',
'USER': 'myuser',
'PASSWORD': 'mypass',
'HOST': 'localhost', # Or an IP Address that your DB is hosted on
'PORT': '3306',
},
'sap': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'sapdb',
'USER': 'myuser',
'PASSWORD': 'mypass',
'HOST': 'localhost', # Or an IP Address that your DB is hosted on
'PORT': '3306',
},
'sfdc': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'salesforcedb',
'USER': 'myuser',
'PASSWORD': 'mypass',
'HOST': 'localhost', # Or an IP Address that your DB is hosted on
'PORT': '3306',
}
}
答案 0 :(得分:3)
首先,您需要一个适用于您的应用程序的数据库路由器,我会尝试使用所提供的信息执行类似于您需要的操作
<强> APP1 / routers.py 强>
class App1Router(object):
def db_for_read(self, model, **hints):
if model._meta.app_label == 'app1':
return 'default'
return None
def db_for_write(self, model, **hints):
"""
Attempts to write auth models go to app1.
"""
if model._meta.app_label == 'app1':
return 'default'
return None
def allow_relation(self, obj1, obj2, **hints):
db_list = ('default', 'sap', 'sfdc')
if obj1._state.db in db_list and obj2._state.db in db_list:
return True
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
return True
并在 settings.py 文件中添加以下内容
DATABASE_ROUTERS = ['app1.routers.App1Router',]
您可以使用inspectdb命令创建现有数据库的模型,例如:
./manage.py inspectdb --database "sap"
我希望它有所帮助
来源:个人经验和Django文档https://docs.djangoproject.com/en/1.10/topics/db/multi-db/
答案 1 :(得分:1)
Django支持多个数据库,如下所述:
https://docs.djangoproject.com/en/1.10/topics/db/multi-db/
假设您将主数据库设置为主数据库,则必须确保在从其他数据库读取数据时指定要访问的数据库。
答案 2 :(得分:0)
其他答案已经提到了这个问题的多数据库性质,并与文档相关联。
您可能希望使用类似Django REST Frame的内容来运行对其他表的访问,作为应用程序其余部分的迷你服务,而不是尝试在Views代码中上下文切换数据库调用。
E.g。如果您需要在SAP
或SalesForce
表中查找数据,则使用该ID向后端服务发出Ajax请求。它将根据您的需要向您发送JSON答案。
通过这种方式,您可以在将来抽象关系并更改实现细节,而无需重写大量代码。