如何在第二个数据库中保存ManyToMany字段

时间:2013-02-12 08:59:30

标签: django django-models

我有两个数据库:

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

来自“默认”数据库的所有条目都显示在“slave”中,而没有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)

所以我认为解决方案已接近,但不在这里

2 个答案:

答案 0 :(得分:1)

django不支持跨数据库关系。

摘自cross database relations

Django目前不提供跨越多个数据库的外键或多对多关系的任何支持。如果您使用路由器将模型分区到不同的数据库,那么由这些模型定义的任何外键和多对多关系必须是单个数据库的内部。

但是,正如here所述,您可以实现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)

答案 1 :(得分:0)

rohan's idea的一点修改......(假设用户'用户已经存在于奴隶数据库中)

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