将第二个遗留数据库添加到现有的django 1.2项目中

时间:2011-03-08 00:27:28

标签: django legacy multiple-databases

我有一个django项目,我已经使用了一段时间,但现在我想从第二个非django数据库中添加一些新的数据集。我已成功配置我的settings.py文件以使用新数据库,该数据库名为'mediawikidb'。

我可以运行以下命令:

python manage.py inspectdb --database=mediawikidb

我获得了数据库的django模型表示,但我感兴趣的表名为“User”。 inspectdb的输出如下所示:

class User(models.Model):
user_id = models.IntegerField(primary_key=True)
user_name = models.CharField(unique=True, max_length=255)
user_real_name = models.CharField(max_length=255)
user_password = models.TextField()
user_newpassword = models.TextField()
user_newpass_time = models.CharField(max_length=14, blank=True)
user_email = models.TextField()
user_options = models.TextField()
user_touched = models.CharField(max_length=14)
user_token = models.CharField(max_length=32)
user_email_authenticated = models.CharField(max_length=14, blank=True)
user_email_token = models.CharField(max_length=32, blank=True)
user_email_token_expires = models.CharField(max_length=14, blank=True)
user_registration = models.CharField(max_length=14, blank=True)
user_editcount = models.IntegerField(null=True, blank=True)
class Meta:
    db_table = u'user'

我一直在阅读文档[0],但我很困惑,所以我想在阅读了一段时间之后我会问这里。我不能把它放在我的模型中,是吗?如果我这样做肯定会导致django问题。我该怎么做?

我的另一个问题是,django将如何知道这个“用户”模型实例与哪个数据库相关?我觉得我错过了什么,但我找不到任何有意义的东西。

我应该如何设置我的模型才能访问这些数据而不会弄乱django中的任何内容?

[0] http://docs.djangoproject.com/en/dev/topics/db/multi-db/

2 个答案:

答案 0 :(得分:2)

我认为你担心被称为user的表,而模型类被称为User。 Django对其表使用app_modelname,因此django.contrib.auth的表为auth_user

Django不知道您的用户模型与哪个数据库相关。它将采用默认值,因此它将查找可能在您的数据库中不存在的表user

要查询它,您需要指定一个特定的数据库(User.objects.using('mydb').all())或设置Dimitry建议的自动数据库路由。

答案 1 :(得分:1)

检查以下文档:

http://docs.djangoproject.com/en/dev/topics/db/multi-db/#an-example

他们有一个路由器示例,指示从哪里读取数据和向其写入数据。对于您的用户模型,您可以配置与mediawiki数据库的所有交互,所有其他模型将使用您的普通数据库。

确保禁用关系......

class MyAppRouter(object):

    def _is_user_model(model):
        return str(model.__name__) == 'User' and model._meta.app_label == 'myapp'

    def db_for_read(self, model, **hints):
        if self._is_user_model(model):
            return 'mediawikidb'
        return None

    def db_for_write(self, model, **hints):
        if self._is_user_model(model):
            return 'mediawikidb'
        return None

    def allow_relation(self, obj1, obj2, **hints):
        if self._is_user_model(obj1) or self._is_user_model(obj2):
            return False
        return None

    def allow_syncdb(self, db, model):
        if db == 'mediawikidb':
            return False
        elif self._is_user_model(model):
            return False
        return None