从其他数据库获取数据

时间:2013-05-17 10:26:15

标签: django django-admin

我想问一个我遇到的问题,而且我缺乏经验,我不确定它是不是最好的选择。

目前,我们已在服务器中安装了“OCS库存报告”,该报告可保留我们拥有的所有计算机的更新清单。 我们的目的是使用这些数据在我们的django管理站点上查看。 首先,我将在我们的应用程序中创建所有模型。 在管理站点中创建计算机并保存时,OCS数据库中的信息将导入到数据库中。

我不知道这是不是最好的方法。 我不知道django提供的所有可能性。 每次创建新对象时导入数据会很有效吗? 有没有机会在管理界面中显示信息而不将其导入我的应用程序并直接攻击其他数据库? (抱歉我的英语不好)

1 个答案:

答案 0 :(得分:1)

我假设您希望django admin只准备好OCS数据库。

首先,您需要在DATABASES设置中定义外部数据库:

DATABASES = {
    'default': {
        ... django db settings here ...
    },
    'ocs_db': {
        'ENGINE': 'django.db.backends.mysql',
        'OPTIONS': {
            'read_default_file': '/path/to/my.cnf',
        },
    }
}

您可以试试python manage.py inspectdb --database ocs_db; inspectdb在db上查找表并将模型定义转储为python模块。 如果这不起作用,那么你必须手动完成。

然后你希望django不管理那个表(这样就不会删除任何行,也不会对表进行任何操作),你可以通过Meta托管选项来实现。

我建议你用这个选项编写一个基类(最后是所有OCS模型需要的其他自定义)。

class OCSBaseModel(models.Model):

    def save(self):
        """
        avoid inserts / edits from model
        """
        return 

    class Meta():
        abstract = True
        managed = False


class Workstation(OCSBaseModel):
    ...

作为最后一步,您需要指示Django为OCS模型使用正确的数据库。

为此,您需要编写一份数据库路由器,如文档here

所示

或为OCS模型实现django模型管理器,将每个查询集标记到数据库。 例如

class OCSModelManager(models.Manager):
    def get_query_set(self):
        return super(OCSModelManager, self).get_query_set().using('ocs_db')

请注意,我没有测试任何此代码;)