3

我有两个数据库:

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')

'default' 数据库中的所有条目都出现在没有 ManyToMany 字段用户的 'slave' 中。如何将用户字段显式复制到“从”数据库?

编辑:

我尝试来自 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

对rohan的想法稍作修改……(假设从库中已经存在'User')

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 回答