1

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

我能够运行以下命令:

python manage.py inspectdb --database=mediawikidb

我得到了数据库的 django 模型表示,但我感兴趣的表称为“用户”。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/

4

2 回答 2

2

我想你担心表被调用user,模型类被调用User。Django 使用app_modelname它的表,所以它django.contrib.auth的表是auth_user

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

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

于 2011-03-08T00:44:55.823 回答
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
于 2011-03-08T00:32:28.720 回答