3

私は2つのデータベースを持っています:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(ROOT_PATH, 'db', 'sqlite.db'),
    },

    'slave': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(ROOT_PATH, 'db', 'slave.db'),
    }

}

ManyToMany フィールドを持つテーブルがあります。

from django.db import models
from django.contrib.auth.models import User

class Data(models.Model):
    xml     = models.TextField(max_length=90000)
    users   = models.ManyToManyField(User)

コードを実行すると:

for i in Data.objects.all():
    i.save(using='slave')

「デフォルト」データベースからのすべてのエントリは、ManyToMany フィールド ユーザーなしで「スレーブ」に表示されます。ユーザーフィールドを「スレーブ」データベースに明示的にコピーするにはどうすればよいですか?

編集:

Rohan からのアドバイスを試してみます。

for i in Data.objects.all():
    back_i = i
    # back_i.users.all().count() = 1
    i.save(using='slave')
    # back_i.users.all().count() = 0
    for u in back_i.users.all():
        i.users.add(u)

解決策は近いと思いますが、ここではありません

4

2 に答える 2

1

django はデータベース間の関係をサポートしていません。

データベース間の関係からの抽出

Django は現在、複数のデータベースにまたがる外部キーまたは多対多の関係をサポートしていません。ルーターを使用してモデルを異なるデータベースに分割した場合、それらのモデルによって定義される外部キーと多対多の関係は、単一のデータベースの内部にある必要があります。

ただし、ここでpost_save説明したように、ユーザーがデータベースに同じユーザー レコードを持つようにシグナルを実装できslaveます。ただし、両方のデータベースからユーザーを削除するなど、データベースの一貫性を維持する必要があります。

更新:別のデータベースに保存するManyToManyには、これを試すことができます

for i in Data.objects.all():
    back_i = i
    i.save(using='slave')
    for u in back_i.users.all():
        i.users.add(u)
于 2013-02-12T09:13:40.653 に答える
0

ローハンのアイデアを少し修正... (「ユーザー」はスレーブデータベースに既に存在すると想定されています)

for item in Data.objects.all():

    new_item = item
    item_users = item.users.all()

    new_item.save(using='slave')

    for u in item_users:
       u2 = User.objects.using('slave').get(pk=u.id)
       new_item.users.add(u2)

    new_item.save(using='slave')
于 2015-03-06T00:04:24.277 に答える