1

しばらく使用している django プロジェクトがありますが、今は 2 番目の非 django データベースから新しいデータセットを追加したいと考えています。「mediawikidb」と呼ばれる新しいデータベースを使用するように settings.py ファイルを正常に構成しました。

次のコマンドを実行できます。

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.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 に答える